C语言二维数组地址问题

一些概念,请真正懂得的大神帮忙解答,网上各种回答太多,各有说法。
1、&a[0][0]为0行0列元素的首地址,a[0]+n为0行第n个元素地址,那么a[0]是表示0行首元素地址吗?&a[0]是零行的首地址,实际上行的地址也只有一个,也无所谓0行的首地址吧?+n相当于元素位移了n个位置吗,所以代表第n个元素地址吗?然后*(a[n]+m)就表示n行第m个元素了?
2、书中写a+n表示第n行的首地址,那是相当于&a[n]吗,a不是表示数组首个元素地址吗,怎么+n不是元素位置改变,却是位移了行?还是a+n表示n行首个元素的地址?为什么
*(a+n)与a[n]是等价的,原理是什么,*(*(a+n)+m)怎么也能表示n行m列元素呢?

1、&a[0][0]为0行0列元素的首地址,a[0]+n为0行第n个元素地址,那么a[0]是表示0行首元素地址吗?

>>正确, a[0]就是0行首地址.

&a[0]是零行的首地址,实际上行的地址也只有一个,也无所谓0行的首地址吧?

>>&a[0]值上, 是和a[0]相同的, 不过类型不一样. a[0]等效于int *型,实际上是指向一个元素. 而&a[0]是行指针, 指向一行.所以,a[0]+n和&a[0]+n是完全不同的. 

+n相当于元素位移了n个位置吗,所以代表第n个元素地址吗?

>>+n取决于原始指针的类型. 如果是a[0]+n 移动的是n个元素.而&a[0]+n就是移动n行了.

然后*(a[n]+m)就表示n行第m个元素了?

>>这句没错. 任何情况下, *(p+n)都等效于p[n]
2、书中写a+n表示第n行的首地址,那是相当于&a[n]吗,a不是表示数组首个元素地址吗,怎么+n不是元素位置改变,却是位移了行?

>>这个上面说过了, 核心在于指针的类型. 二维数组int a[M][N]的数组名a, 本质上是常量的int (*)[N]类型, 也就是数组指针. 移动的时候是整行移动的. 

还是a+n表示n行首个元素的地址?为什么

>>同上
*(a+n)与a[n]是等价的,原理是什么,*(*(a+n)+m)怎么也能表示n行m列元素呢?

>>*(a+n)与a[n]等价, 这个是C语言的一个规则. 其本质是, 当编译器遇到a[n]这样的形式时, 实际上是翻译成*(a+n)进行编译的. 这种可以用一个很少见的形式来验证.你定义

int a[4]={1,2,3,4}; 然后输出

printf("%d\n", 3[a]);

对, 就是把数组名放进[], 实际上会输出a[3]

追问

如a[m][n]数组名a, 本质上是常量的int (*)[n]类型, 移动是整行移动的。那么a+1即移动一行,下题中指针p=a,然后p++,却是逐个元素切换,又是怎么回事?(题中p=a[0],但是改成p=a也可以运行)
{int a[3][5],i,j,*p;

p=a[0];
printf("please input:\n");

for(i=0;i<3;i++)
{for(j=0;j<5;j++)
{scanf("%d",p++);
}}p=a[0];
printf("the array is:\n");
for(i=0;i<3;i++)
{for(j=0;j<5;j++)
{printf("%5d",*p++);
}}}

追答

不管是用a还是a[0]赋值,p的类型都是int*。
而在加的时候,只和p的类型有关,与从哪里赋值的无关

追问

所以数组名并不是数组首个元素的地址,虽然地址值一样,二维数组名的含义实际是数组首行的地址。
我自学的书中都没有这些知识点,请问有推荐的自学书籍吗?

追答

所以数组名并不是数组首个元素的地址,虽然地址值一样,二维数组名的含义实际是数组首行的地址。
-----是这样的
我自学的书中都没有这些知识点,请问有推荐的自学书籍吗?
---入门书一般没这些,容易乱,找些进阶的吧,或者实战中提高
----回复评论:值都是n行首地址,但类型不同

追问

a+n表示第n行的首地址,*(a+n)表示n行首个元素地址?

温馨提示:内容为网友见解,仅供参考
无其他回答

c语言二维数组是怎么存放的?
在c语言里二维数组元素在内存中是按行存放的。二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:LOC(a[i][j]) = LOC(a[p][q]) + ((i −...

c语言中二维数组地址疑问
从二维数组的角度来看,a代表二维数组首元素的 地址,现在的首元素不是一个整型变量,而是由4 个整型元素所组成的一维数组,因此a代表的是首 行的起始地址(即第0行的起始地址,&a[0]),a+1代 表a[1]行的首地址,即&a[1]。因此a[0]代表一维数 组a[0]中0列元素的地址,即&a[0][0]。a...

C语言地址运算问题
1. 地址加整数:整数表示移动的单位数。对于二维数组,例如定义了一个数组 `a[][]`,`a` 能代表数组的一行,`a+1` 表示向后移动了一行,即 `a[1]`,也就是 `a[1][0]` 的地址。2. 数组元素管理:`a[i]` 是以单个元素为单位进行管理的,`a[i]+1` 表示以 `a[i][0]` 为起始...

c语言的二维数组地址问题
答:二维数组a[3][4]中,a[1]+1是数组a[1]的第2个元素的地址,a[0]+4是数组a[0]的第5个元素的地址,但a[0]只有4个元素,所以a[0]+4就是a[1]首元素的地址,因此这是两个不同的地址。另外,也可以将二维数组a[3][4]看成一维数组a[12],那么原来的a[1]+1就是一维数组的a[5...

二维数组的地址问题
>>这句没错. 任何情况下, *(p+n)都等效于p[n]2、书中写a+n表示第n行的首地址,那是相当于&a[n]吗,a不是表示数组首个元素地址吗,怎么+n不是元素位置改变,却是位移了行?>>这个上面说过了, 核心在于指针的类型. 二维数组int a[M][N]的数组名a, 本质上是常量的int (*)[N]类型...

C语言二维数组问题,求教!!!
c中数组小标从0开始,A【4】【3】相对于A【0】0的偏移量为4*6+3=27,那么地址应该为:100+27*16(2个字节)=1432 FORTRAN从1开始,那么A【4】【3】相对于首地址的偏移为3*6+2=20,那么地址应该为:100+20*16=1320 很久没接触这个了,不是太肯定,仅供楼主参考。希望能帮到楼主。数据项...

c语言二维数组字节问题 求大神解答
数组名代表数组的地址,也就是第一个数组元素的地址(此题中为a[0][0]的地址)。a+1也就是&a[0][0]+1即为&a[0][1]了,是在列上变化,数组元素是int型,所以是2个字节(这不准确,在新的编译器上,int可能是4个字节)。而a[1]是行地址,即a[0],a[1],a[2]这三个都是行地址,...

C语言地址运算问题
地址+整数,这里的整数代表的是向后移动的单位数,二维数组的各个地址是这样的:比如定义了一个数组a[][],a能够为数组的一行代言,a+1就向后走一行变成a[1]了,也就是a[1][0]的地址,a[i]是以单个的元素为单位进行管理的,那么a[i]+1就是以a[i][0]为起始点向后走一个元素所占的字节...

c语言中二维数组a[i][j],为什么a=*a?
二维数组a定义为a[i][j]时,代表一组数据,有i行j列,共计i*j的元素。这组数据在内存中是连续存放的。而在C语言的使用中,a是二维数组的首地址。*a也就是a[0],是二维数组第一行的首地址。所以,二者是相同的地址值,即数据a[0][0]的地址值。也就是说,从值上,a,*a, a[0],&a[...

C语言二维数组的问题,那个(4)(5)表示啥?
a和a[0]二者都代表a[0][0]的地址,即&a[0][0]。所以&a[0][0]+4*i+j(4)与a[0]+4*i+j(5)相同,都是a[i][j]的地址。

相似回答