我在网上看到了这段代码。我根本不明白这里发生了什么。
#include <stdio.h>
#include <math.h>
main()
{
int arr [ ][3] = {{11,12,13}, {21,22,23},{31,32,33},{41,42,43},{51,52,53}};
int I , j ;
int *p , (*q) [3], *r ;
p = (int *) arr ;
q = arr;
r = (int *) q ;
printf (" %u %u %d %d %d %d \n ", p, q, *p, *(r), *(r+1), *(r+2));
p++ ;
q++ ;
r = (int *) q ;
printf (" %u %u %d %d %d %d \n ", p, q, *p, *(r), *(r+1), *(r+2));
}
我知道 p 和 r 是指针,q 是指向数组的指针,但是 p = (int *) arr ; 是什么意思?是什么意思?这句话的目的是什么?
最佳答案
表达式中的
arr
被隐式转换为指向其第一个元素的指针。由于 arr
的元素具有 int[3]
类型,因此 arr
会转换为 int ( * )[3]
>
下面的代码片段演示了这种隐式转换
int (*q) [3];
q = arr;
声明
p = (int *) arr;
表示像int *
一样转换后重新解释int ( * )[3]类型的arr
。
arr
之前的 ( int * )
表示所谓的强制转换,即重新解释。
现在二维数组arr
占用的内存被重新解释为类型为int [15]
和p<的一维数组占用的内存
指向这个虚构数组的第一个元素。
关于c 指针和数组指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327750/