hswangrui 发表于 2017-1-2 20:04:28

数组指针的疑惑



#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;
}

代码农民 发表于 2017-1-2 21:25:08

我是这样想的,如果不指定[ ]中的内容,那么p指针的意思就变成了指向任何长度的数组的指针,既而p+1将无法确定一行有多少个元素,从而造成混乱...

hswangrui 发表于 2017-1-2 22:20:19

代码农民 发表于 2017-1-2 21:25
我是这样想的,如果不指定[ ]中的内容,那么p指针的意思就变成了指向任何长度的数组的指针,既而p+1将无法 ...

那为什么要和数组元素个数一样呢....

b84408190 发表于 2017-1-3 08:46:59

(*p)代表的是二维数组指针,array是一维数组,int *p=array 即可。

上题中(*p)可理解为指向了包含array元素的二维数组er_array。二维数位可理解为在一个维数组内含有N(10)个地址元素。(相关阐述可查阅二维指针的定义资料).

zealstar 发表于 2017-1-3 09:37:50

向来喜欢用一图流解释,首先看原代码:

      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字节。

我觉得我能说明的,也就这么多了。能理解就好,不能理解再换其他解释。

代码农民 发表于 2017-1-3 16:52:16

hswangrui 发表于 2017-1-2 22:20
那为什么要和数组元素个数一样呢....

int (*p);
在这个声明里,p是个行指针,同时对p这一行指针给出了限制....所以你在用p这个指针的时候只能指向10个元素的数组..

hswangrui 发表于 2017-1-3 17:27:39

zealstar 发表于 2017-1-3 09:37
向来喜欢用一图流解释,首先看原代码:




谢谢。。。打字辛苦!!!!
页: [1]
查看完整版本: 数组指针的疑惑