当前位置: 首页 > news >正文

C语言问题 - 关于一维数组和二维数组用*a+i形式表达

问题

今天在编写程序时被一个语句搞懵了:

#include<stdio.h>int main()
{int *pa[6];int a[2][3] = {{1,2,3},{4,5,6}};int sum = 0;int i,j,k = 0;for (i=0; i<2; i++){for (j=0; j<3; j++){*(pa + k) = *(a + i) + j;k++;}}for (i=0; i<k; i++){printf("%d ", *(*(pa + i)));}printf("\n");return 0;
}

输出结果:

1 2 3 4 5 6 

把我搞懵的是*(pa + k) = *(a + i) + j;

(其实真的很简单的道理还一直在纠结。。。)

其实这句话就是指(对等号左右边语句分别解释):

  • 每次循环 pa+k都会让pa指针都会向下移动一格,而加上星号*就是为了取指针所指的值,而pa数组存放的都是指针,所以这里加 * 就是为了取得指针里存放的地址,最后整体的 *(pa+k) 也就是 pa[k] ,那么等号左边解释完了,到底这个地址是什么地址呢?

  • 等号右边给了解释,a是数组a首地址,+i 不再是只移动一格,因为a是行指针,一次移动一行,所以a+0 时指针还在第一行原地, a+1 时指针已经到了第二行开头,而加上 * 以后的 *(a+i) 就是 取 a+i 地址的值,也就是 a[i] ,而a[i]具有特殊含义,因为它是二维数组的a[i],二维数组每一行的首地址,所以首地址再加上 j ,就是以列进行偏移,所以*(a+i)+j 就是数组a中元素的地址。

综上,等号左边的是指针数组pa中元素的地址,等号右边是数组a中元素的地址,把等号右边的值赋给左边,就是把数组a中的元素地址保存在指针数组pa中。

小结

对于一维数组来说 *(a+i) 和 a[i] 这是等价的,一定要注意分辨 *a+i 和 *(a+i) ,这俩可不一样噢!!!

假设有以下数组定义:

int a[5] = {1, 2, 3, 4, 5};

如果我们想访问数组中的第三个元素,即索引为2的元素,可以使用*(a+2)a[2]

示例1:使用*(a+2)来访问数组元素:

int result = *(a + 2);  // 等同于 int result = a[2];
printf("%d\n", result); // 输出:3

示例2:使用*a+2来进行运算:

int result = *a + 2;
printf("%d\n", result); // 输出:3 (等同于 a[0] + 2)

在示例2中,*a首先取得指向数组第一个元素的指针,即a[0]的值为1。然后,将1与2相加得到3。

所以,*(a+2)的结果是访问数组中索引为2的元素的值,而*a+2的结果是将数组第一个元素的值与2相加。

http://www.lryc.cn/news/136681.html

相关文章:

  • 验证码识别DLL ,滑块识别SDK,OCR图片转文字,机器视觉找物品
  • 【图论】最小生成树的应用
  • C++类模板的特化(三)
  • 基于YOLOV8模型的课堂场景下人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)
  • java八股文面试[数据结构]——Map有哪些子类
  • 司徒理财:8.23今日黄金原油走势分析附操作策略
  • 使用动态IP是否会影响网络
  • Linux学习笔记-常用指令说明
  • MyBatisPlus进阶版
  • 安防视频云平台EasyNVR视频汇聚平台硬件无法进入服务器的问题处理方法
  • 流媒体内容分发终极解决方案:当融合CDN与P2P视频交付结合
  • 根据源码,模拟实现 RabbitMQ - 内存数据管理(4)
  • Apache Flume架构和原理
  • 代码随想录算法训练营day38 | LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
  • Linux基本指令【下】
  • 向量检索:基于ResNet预训练模型构建以图搜图系统
  • SpringBoot 响应头添加版本号、打包项目后缀添加版本号和时间
  • 优化指南:带宽限制的可行策略
  • 计算机提示mfc120u.dll缺失(找不到)怎么解决
  • Java基于SpringBoot+Vue实现酒店客房管理系统(2.0 版本)
  • 微服务架构2.0--云原生时代
  • C++day2作业(2023.8.22)
  • 在 Spring Boot 中使用 OpenAI ChatGPT API
  • 【leetcode】225.用队列实现栈
  • 机器学习中XGBoost算法调参技巧
  • 第1章:计算机网络体系结构
  • 【Java 动态数据统计图】动态数据统计思路Demo(动态,排序,containsKey)三(115)
  • 【游戏评测】河洛群侠传一周目玩后感
  • java新特性之Lambda表达式
  • 【考研数学】线形代数第三章——向量 | 2)向量组相关性与线性表示的性质,向量组的等价、极大线性无关组与秩