数组指针的疑惑
#include <stdio.h>
int main()
{
int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p) = &array; \\ 我对这里有疑问也尝试修了许多数值 但都报错 这句话里步长为什么必须和数组大小相同?问什么不可以舍去步 \\ 长是int *p=&array???
printf("%d\n", *(*(p+1)-2));
return 0;
} 我是这样想的,如果不指定[ ]中的内容,那么p指针的意思就变成了指向任何长度的数组的指针,既而p+1将无法确定一行有多少个元素,从而造成混乱... 代码农民 发表于 2017-1-2 21:25
我是这样想的,如果不指定[ ]中的内容,那么p指针的意思就变成了指向任何长度的数组的指针,既而p+1将无法 ...
那为什么要和数组元素个数一样呢.... (*p)代表的是二维数组指针,array是一维数组,int *p=array 即可。
上题中(*p)可理解为指向了包含array元素的二维数组er_array。二维数位可理解为在一个维数组内含有N(10)个地址元素。(相关阐述可查阅二维指针的定义资料).
向来喜欢用一图流解释,首先看原代码:
int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*p) = &array;
解析p:
p是一个指向int 的指针,跨度就是一个含10个int元素的数组,实际上就是4*10字节。和&array代表的意思一样。
*p是指向一个int元素的指针,跨度是int的占位宽,即4字节。和array代表的意思一样。
所谓“左右[ ]内的数值一样”的理由就是,跨度必须一样,类型才相同,左右才能对齐。
那么,我们修改代码,让[ ]内左右不同(编译时候会警告,提示左右类型不同,暂时无视!)代码如下:
int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*x) = &array;
解析x:
x是一个指向 int 的指针,跨度是4*4字节,即16字节。
*x是一个指向int元素的指针,跨度是4字节。
我觉得我能说明的,也就这么多了。能理解就好,不能理解再换其他解释。 hswangrui 发表于 2017-1-2 22:20
那为什么要和数组元素个数一样呢....
int (*p);
在这个声明里,p是个行指针,同时对p这一行指针给出了限制....所以你在用p这个指针的时候只能指向10个元素的数组.. zealstar 发表于 2017-1-3 09:37
向来喜欢用一图流解释,首先看原代码:
谢谢。。。打字辛苦!!!!
页:
[1]