一, 数组名 == 指针变量
如下代码的输出结果, 是数组 a 的第一个元素
- (void)testArray{
int a[3]={1,2,3};
int *num[3];
int **p,i;
for(i=0;i<3;i++)
num[i]=&a[i];
p=num;
printf("%p---%p",p,num);// 0x7ffee5800930---0x7ffee5800930
printf("%d",**p);
}
分析如下:
int *num[3]
可以看成(int *) num[3]
, 存放了三个整型地址的数组, 数组的每个元素都存放的是地址, 这个地址指向的内存中的数据, 要按照整型数据来读取.p=num
把num
中存放的内容赋值到p
的内存中, 即将指针p
的指向和数组的首地址num
的指向一样, 即数组中第一个元素的地址,(*p)
就等价于* num
, 也就是num[0]
, 而num[0]
又被赋值为a[0]
的地址, 则*(* p)
就是a[0]
的内容了.
(PS:char *name = (char *)malloc(sizeof(char)*10)
可以把这段代码中的 name 理解成数组的指针, 指向数组开始的地方...只是这里是动态开辟内存, 数组是静态开辟内存.)- p 是一个指针, 不管是几级指针, 变量的内存空间始终是一个字, 和计算机的位数有关, 也就是计算机的寻址范围.
- 使用
%p
打印的是指针变量p中存放的地址内容, 而不是p
的内存地址,p
的内存地址可以用&p
打印出来.num[4]
相当于*(num+4)
, 要清醒num+4
只是一个指针.
网友评论