
有二位数组a[n][m] 对于指针问题 *(*(a+i)+j) 与 a[i][j] 为什么等价 (i ,j在n,m范围内)?
对于*号不是取值吗?a是a[0][0]的地址,那么a+i也是一个地址,则*(a+i)不是值吗?然后再加j再用*符号干什么?书上只有*(*(a+i)+j)与a[i][j]等...
对于*号不是取值吗?a是a[0][0]的地址,那么a+i也是一个地址 ,则*(a+i)不是值吗? 然后再加 j 再用 *符号干什么? 书上只有*(*(a+i)+j) 与 a[i][j] 等价,但我不理解!望大神解答
展开
2个回答
展开全部
首先,二维数组实质上是一段连续空间,而数组名也仅仅是一个记号,它并不是指针.
但它可以当作指针使用.这是编译器语法解析时的处理.
真正的指针应该是一个存有地址的变量.所以指针和数组名是不同的.
a[n][m]这个二维数组.是一个n*m的空间.它可以当作一个二级指针在基作用域内使用.
二级指针是一个指向指针的指针.
但它可以当作指针使用.这是编译器语法解析时的处理.
真正的指针应该是一个存有地址的变量.所以指针和数组名是不同的.
a[n][m]这个二维数组.是一个n*m的空间.它可以当作一个二级指针在基作用域内使用.
二级指针是一个指向指针的指针.
追问
*(a+i)与a[i]等价 是怎么理解的?
追答
这个要看a的类型了
如果 a数组里最终数据是 int类型的的
int a[10];
a[3]和 *(a+3)是等价的
a作为数组名,可以当作指针用.其值为数组开始的地址.其实写法可以是 &a,但是为了简单,C标准中规定在a是数组的时候,取地址符号省略了.
一个指针进行下标运算的话.
int *p = a;
p[3] 就是p中存的地址加上 3*sizeof(int),这个地址作为超始后的sizeof(int)的内存段,这段内存中的数值.
如果是 int a[10][10]
那么 a[3]就是 a的首地址加上 3*sizeof(int [10]),的地址.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询