c语言二维数组a,为什么a和(a+1)等

2020-11-26 06:32:33 字数 5957 阅读 3187

1楼:

*(a+1)指针取得不就是地址吗

2楼:匿名用户

*(a+1)是定义的指针,

因为数组的起始地址a[0]可以用a来代替~

所以a[1]和*(a+1)是同一个地址

3楼:

首先a代表整个数组的首地址没问题吧,a+1就是把地址下移,*(a+1)就是取其地址的内容。这回可以理解了吧!

c语言中二维数组a[i][j],为什么a=*a?

4楼:匿名用户

在c语言中,二者是相同的地址值。所以可以说a=*a.

二维数组a定义为a[i][j]时,代表一组数据,有i行j列,共计i*j的元素。

这组数据在内存中是连续存放的。而在c语言的使用中,a是二维数组的首地址。*a也就是a[0],是二维数组第一行的首地址。

所以,二者是相同的地址值,即数据a[0][0]的地址值。

也就是说,从值上,a,*a, a[0],&a[0][0]都是相同的值。

当时,说a=*a也并不是完全正确的,从类型上,a等同于二维指针,而*a等同于一维指针。二者类型并不相同,只是在一定条件下可以转换。

5楼:匿名用户

我理解问题中的这个=楼主是指相等,而且是数值上相等。这是肯定的。*a实际是*(a+0)+0,也即是a[0]+0这个地址,和a一样,其数值也是这个二维数组的首地址。

但是二者含义可不同,不能直接相互赋值。a是行指针,即a是一个大小为i的数组,其元素也是数组,大小为j。*a由上面的解释,其实质是个列指针,指向a的第一个元素(大小为j的数组)的第0个元素。

6楼:匿名用户

#include "stdio.h"

main()

} 正确的写法应该是上面这样的。

这里涉及到2个问题:

1.数组声明的时候a[9]就是有9个元素的数组,a[10]就是有10和元素的数组

2.数组赋值的时候第一个元素的下标是从0开始的,即a[0],最后一个下标是声明时的数字-1,如:声明时:a[9],最后一个元素是a[8]。a[9]是超范围的。

7楼:

数组名a表示二维数组的首地址,*a就好比第一行的地址值a[0],a[0]表示&a[0][0]....

8楼:匿名用户

二维数组的指针比较特别,* 的作用是将行指针转换成列指针,数组名a是指向第一行的指针,*a则是指向第一行第一列的指针,根本含义上市不一样的,但是值都是a【0】【0】的地址

c语言中的二维数组里a+1和*(a+1)为什么都是地址

9楼:刘文正粉丝

二维数组, int a[10][20];

a是一个指针的指针, 即二级指针.

一个指针加一个数, 当然还是指针(即a+1是指针)

取值一个二级指针, 是一级指针(即指针), 所以还是指针, 不过类型发生了变化.

a+1的类型为int *[10].

而*(a+1)的类型则为int *, 也就是平常的指针.

如果你学习二维数组是用心, 你就会知道不存在二维数组, 二维数组其实是一个包含数组的数组, 即数组的每一个元素还是一个数组(这点有点像面向对象的思维).

所以a[0]就是取第一个元素值, 而第一个元素是数组, 所以其值仍是一个指针.

答了这么多, 一看问题, 发现是"地址".....地址和指针是一个东西.

10楼:zh呼啸而过

例如a[5][10];

a + 1的值是第二行的首地址,

* (a + 1)得值也是第二行的首地址,但是a + 1不等于a[1],而* (a + 1)等于a[1]。

如果给a+1再加1,就是a+1+1,就是a+2,它的值是第三行的首地址

如果给*(a+1)再加1,就是*(a+1)+1,它的值是第二行的第二个地址

他们移动的区别:前者是纵向的,后者是横向的。

指针类型的区别:两者均存放为同一地址,但前者是指向一维数组,后者是指向元素的。

实际就是前者每次跳动4*10个字节,后者每次跳动4个字节。

11楼:twinkleh丶

a+1应该是 (a+0)+1

这里的a是二维数组中的二级指针

数组名为a[0]的一维数组(表示行)

也是数组名为a的一维数组(表示列)

后面的1表示行数组移动1行

0表示列的移动

所以是1行0列的地址

*(a+1)中a是二级指针

取值二级指针是一级指针

一级指针指向的一维数组(二维数组中的行)

一维数组移动一位只能是向下移动也就是行,

所以就是 第一行的首地址 也就等于二维数组中 第一行零列的地址

12楼:tlier丿残刀

二维数组又包含多个一维数组 a指向第一个一维数组的首地址就还是地址

c语言中的二维数组里a+1和*(a+1)为什么相等?

13楼:匿名用户

它们只是值相等,但类型不相等,不能说它们相等。

a+1是int **类型,指向的是数组a的第二行的起始地址; *(a+1)是int *型,指向的是数组a的第二行第一个元素的地址。

c语言中二维数组*(a+i)的意义

14楼:

*(a+i)——二维数组第i行(从0起算)第一个元素的地址。

15楼:匿名用户

所谓*(a+i)等价于a[i],而a[i]是一个数组名,那么a[i] = &a[i][0],数组名等与首元素的地址

c语言二维数组与指针,我想知道为什么*(a+1).与显示中的a+1,所给出的地址是一样的,怎么理解?

16楼:

a=&a[0];数组名相当于指针,等于数组首地址, 类型为 int(*)[3];

*a= a[0];数组int a[2][3];二维数组 a有两个子数组,a[0],a[1] ;

有2*3 =6个int型元素 a[0][0],a[0][1],a[0][2];a[1][0],a[1][1],a[0][2];

就是说定义一个数组int a[2][3];同时定义了 1+2+6

共九个标识符,6个整型变量,两个三个整型元素的一维数组a[0],a[1] 定义为

;一个二维数组 a;一共定义了9个名字。

*(a+1)=*(&a[1])=a[1];

a+1=&a[0]+1 =&a[1];

由于并无单独的存储空间存储 a[1] 这个指针(a[1][0]的地址),所以a[1]和&a[1] 除了类型不同外,实际内容是相同的,

&a[1]的类型为 int(*)[3];

a[1]的类型为 int [3]; 也就是int* ;

实际上a,a[0],&a[0][0] 甚至&a的值都是相同的,但是类型不同

&a;: int (*)[2][3]; (const ??? int (const ???*)[2][3];)

a,&a[0];: int [2][3] ==>int (*)[3]; (const ??? int (const ????*)[3])

a[0]; :int [3]==>int *; (const??? )int *;

&a[0][0];: int * (const???) int*;

a[0][0]; : int;

17楼:匿名用户

a是双下标变量,相当于定义是int **a; a存放着这个二维数组的首地址,由于是二维数组,

a+1实际上是地址a+3*sizeof(int),(其中的3对应着定义int a[2][3];)也就是a[1][0]的首地址

所以*(a+1)还是一个指针,与&a[1][0]是一样的,a+1是指针,运算结果与前者相同。

18楼:匿名用户

二维数组是两层指针,这个你该明白

*(*(a+i)+j)这个是表示i行的第j个数据,注意啊,是两个*要是不理解,记住套用即可

一个*是指针

所以ij都是指针

a+1是一个指针,表示第1行的首地址(c中数组时从0开始计数的)在二维数组中,

a,a[0],&a[0][0]这三个指针虽然都是a的首地址的值,但是在c中用起来是不一样的

a表示二维数组的首地址

a[0]表示第0行的首地址

&a[0][0]表示第0行的第0个元素的地址

19楼:未来需努力点缀

楼主你好

你这里的a是数组名

数组名a是数组a[2][3]的首地址 也就是a[0][0]的地址那么a+1就是a[0][1]的地址 *(a+1)对应的就是a[0][1]

希望能帮助你哈

20楼:杨复兴

×(a+1)是一个指向 指向(a+1)所以它和a+1的地址是一样的

c语言书上说a(i)和*(a+i)等价,我觉得不对啊

21楼:金色潜鸟

注意方括号和小括号。一维二维不要混淆。

c语言 语句中,方括号 不是标点符号,而是 运算符.

c语言 语句中,有恒等式: a[i] = *(a+i)a[i][j] 等于 (a[i])[j] 套恒等式公式,化成 ( *(a+i) )[j], 再化成 * (*(a+i) + j);

类似地 a[j][i] 等于 (a[j])[i],套恒等式公式,化成 ( *(a+j) )[i] ,再化成 * (*(a+j) + i);

求地址 用 & 运算:

1 维:& (a[i]) = & ( *(a+i) ); 注意 &* 抵消, 得 &a[i] = (a+i )

2维; &(a[i][j]) = (*(a+i) + j);

2维; &(a[j][i]) = (*(a+j) + i);

******************************=2 维:

a(i)等价于&a(i)(0) --- 不是小括号,是方括号,用于2 维 下标变量时的 a[i] 等价于 &a[i][0]a[i] 是第 i 行 的 首地址,等价于 &a[i][0]

22楼:運命に抗

书上是对的,你的理解完全错了。

a[i]并不等价于&a[i][0]。

&a[0]等价于a;

&a[i]等价于a+i

同时取值

*(&a[i])等价于*(a+1);

其中*(&a[i])的*&抵消就是你书上说的 a[i]等价于*(a+1);

c语言 二维数组 (*(a+1)[1]) 和 *(a+5)分别表达什么?

23楼:匿名用户

*(a+1)=a[1]

那么*(a+1)[1] = a[1][1]

*(a+5) = a[5]

为什么.一个数组元素a[i]与a+i的表示等价?

24楼:匿名用户

a是存储的是数组首地址,*a指向的就是数组第一个元素a[0],所以*(a+i)的地址和a[i]的地址一样。数组和指针在一定程度上本质是一样的。

25楼:

只有a是二维数组时,a[i]与a+i才等价,他们都表示第i行的首地址,且类型相同。当a为一维数组时,他们并不等价。

26楼:司燕舞景鑫

不等价吧

*(a+i)与a[i]等价

因为可以理解数组是特殊的地址常量

a代表a[0]的地址

a+1就是地址+1

是a[1]……

c语言三维数组赋值给二维数组为什么可以这样

1楼 你的数组a其实仍然是二维数组,因为你给的值显然是一个二维数组的值即1 2 3 3 2 1 2 5 6 你并没有真正做一个三维数组,所以赋给二维数组完全没问题,数组b的值仍然是像上面那样的形式 c语言怎么为一个三维数组赋值?我的这个二维数组是字符串,要求用c语言,不是c 2楼 匿名用户 ch i...