此程序正确打印所有阵列输出。但是这个程序是如何工作的呢?为什么我们需要s[i]
这里的地址?
#include <stdio.h>
int main(){
int s[4][2] = {{1234,1},{1233,2},{1232,3},{1331,4}};
int (*p)[2];
int i,j,*pint;
for(i=0;i<4;++i){
p = &s[i];
pint = (int*)p;
printf("\n");
for(j=0;j<=1;++j)
printf("%d ",*(pint+j));
}
return 0;
}
答案 0 :(得分:2)
int (*p)[2]
是指向int [2]
类型的指针,它本身基本上是int *
类型,但在数组边界上有一些额外的类型检查。
因此,在p = &s[i];
中,您将p
设置为指向数组s[i]
所在内存区域的指针的地址。
使p
也成为一个数组(即,“本质上”指向内存中具有附加机制的区域的指针)要容易得多,然后直接使用它来指向数组内存区域({ {1}})。但是,在这种情况下,这正是p = s[i]
(作为真正的指针)正在做的事情,因此我们可以完全删除pint
。
所以:
p
请参阅Arrays and pointers或google查看“C数组和指针”以及Pointer address in a C multidimensional array。
注意,我假设您只是这样做以了解指针和数组如何交互,所以我不评论在每种情况下使用指针算法或数组概念是否理想。
另请注意,我说一个数组“本质上是一个指针[...]”,但是,这并不是严格正确的,它在很多情况下就像一个指针,而且大多数情况下这是一个合理的方式来思考事情是如何运作的。实际上,阵列以特殊方式处理。请参阅Is array name equivalent to pointer?和Arrays。
答案 1 :(得分:1)
#include <stdio.h>
int main(){
int s[4][2] = {{1234,1},{1233,2},{1232,3},{1331,4}};
int (*p)[2];
int i,j,*pint;
for(i=0;i<4;++i){
p = &s[i];
pint = (int*)p;
printf("\n");
for(j=0;j<=1;++j)
printf("%d ",*(pint+j));
}
return 0;
}
这里p被定义为一个可以存储两个整数值的数组
int (*p)[2];
在外部for循环中,我们使用p数组来存储4 {1维}。一次1个。
p = &s[i];
在第一次迭代中它将是
p = &s[0] ;
i.e p = {1234,1}
下一次迭代将是
p = &s[1] ;
i.e p = {1234,2}
等等。这就是为什么我们需要&amp; S [i]
内环 只需迭代一维数组就可以打印元素
答案 2 :(得分:1)
唉。我不确定这个代码应该说明什么,而不是如何使易于理解的代码难以理解。
s
是由int
组成的2元素数组的4元素数组。也就是说,对于0..3中的i
,s[i]
的类型为int [2]
(在大多数情况下衰减为int *
),{{1}的类型是&s[i]
。
int (*)[2]
是指向p
的2元素数组的指针。每次循环时,int
都会在p
分配2元素数组的地址。
最后,s[i]
是指向pint
的简单指针,每次循环都设置为指向int
指向的数组中的第一个元素。 p
是写*(pint + j)
的漫长道路。
请注意,pint[j]
和p
完全是多余的;这基本上是一种冗长的写作方式
pint