C语言中关于a+1是几维指针的问题。

C语言中关于a+1是几维指针的问题。问题如下:
1. a+1是一维指针,因为它指向第1行,是一个行指针。
2. a+1是二维指针,因为它指向a[1],而a[1]是a[1][0]的地址。所以a+1代表的地址和a[1][0]相同,所以a+1是二维指针。

以上哪种说法正确?还是其他的哪种说法和解释正确?
补充:
2. a+1是二维指针,因为它指向a[1](依据是 a+1是第一行的“首地址”,而a[1]代表就是第一行的首地址,而a[1]又是a[1][0]的地址。 ),而a[1]是a[1][0]的地址。所以a+1代表的地址和a[1][0]相同,所以a+1是二维指针(即“指针的指针”)。

备注:其实我感觉第2点是错误的。因为在二维数组中并不存在a[1],a[1]只不过是一种计算地址的方式,它并不占用存储单元。所以就不存在什么“指针的指针”的说法。第二点是我在网上看到的。
其实我更认同第1点的看法。“二维指针”这个说法,也是网上看到的。但目前我没在书中见到有这种说法的。
但这个仅仅是我“个人”观点。亟待着肯定或反驳或补充。。

以上的数组都指“二维数组”,a+1,a[1]等都是在“二维数组”中说的。

大家的看法是怎样的?最好能说出为什么。最好要有依据噢。。谢谢。

a是几维的,a+1,a+2....a+i就是几维的,它的相对偏移量是与*a的类型有关。你这个a是二维数组吧,二维数组“相当于”二维指针,那*a就是一维指针,如果是int a[3][5],那么相对偏移就是int [5];

你知道二维指针的意思么:int **a 。 它代表a所掼向的对象是一个一维指针,那它就是二维指针。
指针可以间接寻址的。
比如对二维指针 a可以取**a,也可以取*a;但是对一维指针只能进行一次间接寻址如:对 int *a;只能取*a,不能取**a;他们所指向的空间里面存放的内容不同,我觉得这是最主要的区别吧。
建议楼主去看一下行指针和列指针。。。
虽然a+1是二维指针,因为它指向a[1],而a[1]和a[1][0]的地址相等。但是二者代表含义不同。追问

以上的数组都指“二维数组”,a+1,a[1]等都是在“二维数组”中说的,您感觉哪个对呢?

追答

这样吧,你把数组看成指针,几维数组就是几维指针。用 & 符号则升一级指针,如由一级变成二绩优,用 * 或是 [] 则降一级指针。如对int **a这个a 用 a[2] 则由二级变成一级的。

追问

书中说,在二维数组中,不存在a[i]这样一个实际的变量,它只是一种地址的计算方法,能得到第i行的首地址。
岂不是间接的说明了,无法指向a[1]了么?

追答

它的意思应该是a[i]不是int 或是float等等类型的常量。它是本身就是一个地址常量。无论是哪一种类型的变量或是常量,都可以用指针指向他的。
这里的a[i]是一个地址,也就相当于一个一维指针*a;但是我用一个二维指针就可以指向它拉。只要指针比指向的那个变量高一维指针就好。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-26
a+1的指针类型于他所指向的数组有关,如果指向一维数组,不存在所谓的行指针,那是多维数组里面的概念,如果b[3]={1,2,3}那么a+1就指向2,;
在二维数组里面a[3][3]={1,2,3,4,5,6,7,8,9},a+1的确是行指针,指向第二行,所谓的a[1]是方便理解,其实它里面有三个元素!追问

以上的数组都指“二维数组”,a+1,a[1]等都是在“二维数组”中说的,您感觉哪个对呢?

书中说,在二维数组中,不存在a[i]这样一个实际的变量,它只是一种地址的计算方法,能得到第i行的首地址。
岂不是间接的说明了,无法指向a[1]了么?

追答

是的,a[1]的确不存在,但a[1]这个值是第一行的行指针,a[3][3]={1,2,3,4,5,6,7,8,9},sizeof(a[1])=12可以证明!!若把它当做首地址,则应该理解为a[1]+0,书上都省略了"+0",!

第2个回答  2011-08-26
这个命题是有问题的,
如果数组a是int型的,那么a[1] 应该是a+sizeof(int)
如果数组a是char型的,a+1 和 a[1]的地址相等

我觉得没必要关心a+1是所谓几维指针
我们知道a是数组的起始地址,即a的值是一个地址,这个地址后的一连串空间用来保存数组的元素。那么a+1就是首地址偏移一个字节
如果数组是int型,则这个地址在第一个元素内部,如果是int型则表示是该数组的第二个元素

整个内存空间可以看做是一个超大的一维数组,其他N维都可以用一维数组来表示,
第3个回答  2011-08-26
a+1 与 a的类型一样,a是什么a+1就是什么类型的、维数指针;
当然它值与a不一样

首先你得告诉大家a定义为 int a[3][8]; 此时a可以认为是 (int [8]) * 的类型指针 ;他跟二维指针概念还是有一点点差别的。a+1 也是 (int [8])* 类型指针,没有差别。

不要把值 和类型搞混了。讨论类型的时候不要关心值。追问

以上的数组都指“二维数组”,a+1,a[1]等都是在“二维数组”中说的,您感觉哪个对呢?

追答

二维数组与二维指针有点差别的,你应该辨别其中差别。

你两个备选项有些问题,解释上不妥。

假设: 这样定义的int a[3][8];
1. a+1是(int [8])* 类型指针, 它指向第1行首地址,但也不是说他就是一个一维指针或者行指针。
2. a+1应该算着二维指针,虽然它与二维指针有些差别;原因是你需要使用 a[n][m]两级或者
*(*a)这种方式取它数据。

二维指针一般是这样定义的int **p; 它与 (int [8]) *q 是有差别的。 最大的差别在于 *p 是一个分配了内存的具体值,*q则只是个计算值,没有给他分配内存。

追问

但书中说,在二维数组中,不存在a[i]这样一个实际的变量,它只是一种地址的计算方法,能得到第i行的首地址。
岂不是间接的说明了,无法指向a[1]了么?

追答

书是没有错。
你的间接说明不知道怎么间接法。
a[1]既然是一个数值,我通过很多方法都可以得到这个值啊。
(int)(a+1 ) == (int)(a[1])
实际上 (a+1) [0] 就等同于 a[1] 的 。

a+1 彻头彻尾 与a类型一样,根本不需要想太多。你把二维数组名解释成 (int [8])* 类型,就好理解,不要把它理解成 int ** ;

本回答被提问者采纳
第4个回答  2011-08-27
a[1]就是*(a+1),一模一样。[]就是取地址运算符,解析之后就是*()的形式。

a[1]就是&a[1][0]
所以*(a+1)就是&a[1][0],也就是地址

你不要老想着什么取地址取值,只要按照*的运算规律和数组的基本概念去理解就好了
对于一个二维数组,a表示a[0]的首地址即&a[0],而a[0](把a[0]看作一个一维数组)表示a[0][0]的首地址即&a[0][0]。一句话,数组名代表数组第一个元素的地址。
再好好想想吧
相似回答