2025-03-30 00:24:31
以上的数组都指“二维数组”,a+1,a[1]等都是在“二维数组”中说的,您感觉哪个对呢?
这样吧,你把数组看成指针,几维数组就是几维指针。用 & 符号则升一级指针,如由一级变成二绩优,用 * 或是 [] 则降一级指针。如对int **a这个a 用 a[2] 则由二级变成一级的。
书中说,在二维数组中,不存在a[i]这样一个实际的变量,它只是一种地址的计算方法,能得到第i行的首地址。
岂不是间接的说明了,无法指向a[1]了么?
它的意思应该是a[i]不是int 或是float等等类型的常量。它是本身就是一个地址常量。无论是哪一种类型的变量或是常量,都可以用指针指向他的。
这里的a[i]是一个地址,也就相当于一个一维指针*a;但是我用一个二维指针就可以指向它拉。只要指针比指向的那个变量高一维指针就好。
2025-03-30 07:00:31
以上的数组都指“二维数组”,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",!
2025-03-30 11:46:37
2025-03-30 00:49:56
以上的数组都指“二维数组”,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 ** ;
2025-03-30 04:24:46