问题
今天在编写程序时被一个语句搞懵了:
#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。文章来源:https://www.toymoban.com/news/detail-667556.html
所以,*(a+2)
的结果是访问数组中索引为2的元素的值,而*a+2
的结果是将数组第一个元素的值与2相加。文章来源地址https://www.toymoban.com/news/detail-667556.html
到了这里,关于C语言问题 - 关于一维数组和二维数组用*a+i形式表达的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!