1楼:匿名用户
a[0]第0行的行地址
a[1]第1行的行地址
*a[1]第一行的第一个数。
希望下面的程序可以帮到你:
#include
#include
intmain(void);
printf("a=%d\t",a);
printf("a+1=%d\n",a+1);
printf("*a=%d\t",*a);
printf("*a+1=%d\n",*a+1);
printf("a[1]=%d\t",a[1]);
printf("*a[1]=%d\n",*a[1]);
system("pause");
return0;
}运行结果:
c语言中的二维数组里a+1和*(a+1)为什么都是地址
2楼:刘文正粉丝
二维数组, int a[10][20];
a是一个指针的指针, 即二级指针.
一个指针加一个数, 当然还是指针(即a+1是指针)
取值一个二级指针, 是一级指针(即指针), 所以还是指针, 不过类型发生了变化.
a+1的类型为int *[10].
而*(a+1)的类型则为int *, 也就是平常的指针.
如果你学习二维数组是用心, 你就会知道不存在二维数组, 二维数组其实是一个包含数组的数组, 即数组的每一个元素还是一个数组(这点有点像面向对象的思维).
所以a[0]就是取第一个元素值, 而第一个元素是数组, 所以其值仍是一个指针.
答了这么多, 一看问题, 发现是"地址".....地址和指针是一个东西.
3楼: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个字节。
4楼:twinkleh丶
a+1应该是 (a+0)+1
这里的a是二维数组中的二级指针
数组名为a[0]的一维数组(表示行)
也是数组名为a的一维数组(表示列)
后面的1表示行数组移动1行
0表示列的移动
所以是1行0列的地址
*(a+1)中a是二级指针
取值二级指针是一级指针
一级指针指向的一维数组(二维数组中的行)
一维数组移动一位只能是向下移动也就是行,
所以就是 第一行的首地址 也就等于二维数组中 第一行零列的地址
5楼:tlier丿残刀
二维数组又包含多个一维数组 a指向第一个一维数组的首地址就还是地址
c语言二维数组与指针,我想知道为什么*(a+1).与显示中的a+1,所给出的地址是一样的,怎么理解?
6楼:
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;
7楼:匿名用户
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是指针,运算结果与前者相同。
8楼:匿名用户
二维数组是两层指针,这个你该明白
*(*(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个元素的地址
9楼:未来需努力点缀
楼主你好
你这里的a是数组名
数组名a是数组a[2][3]的首地址 也就是a[0][0]的地址那么a+1就是a[0][1]的地址 *(a+1)对应的就是a[0][1]
希望能帮助你哈
10楼:杨复兴
×(a+1)是一个指向 指向(a+1)所以它和a+1的地址是一样的
c语言中的二维数组里a+1和*(a+1)为什么相等?
11楼:匿名用户
它们只是值相等,但类型不相等,不能说它们相等。
a+1是int **类型,指向的是数组a的第二行的起始地址; *(a+1)是int *型,指向的是数组a的第二行第一个元素的地址。
c语言中多维数组地址**(a+1)怎么详细理解?
12楼:匿名用户
*(p+n)等效于p[n]
所以**(a+1)
=*(*(a+1)+0)
=*(a[1]+0)
=a[1][0]
二维数组a,划线的两句话矛盾吗?a+1的值是地址的首地址?
13楼:谭智轩
不矛盾啊。一维数组和二维数组,对一维数组,a就是首地址,a加1就是首地址后移一位,当然指向a[1]了。二维数组的话,a+1就是第二行的首地址。a[1]加1就是第二行第二列
二维数组中,*a和*a[0]为什么不同。
14楼:金色潜鸟
在 c 语言中不是标点符号,而是运算符。
有恒等式: a[i] = *(a+i)
所以,表达式里, *a[0] = *(*(a+0)) = *(*(a)) = **a.
你的 *a 是一个星,而 *a[0] 是 2 个 星,当然不同。
------
*a不应该是返回以a 的值作为地址的那个空间的取值吗 -- 只有 当 a 是1维数组时才是对的。*a 等于 *(a+0) 等于 a[0];
15楼:匿名用户
二维数组中,*a表示二维数组首地址,*a[0]表示第一行的首地址(即a[0]的首地址,而a[0]又可以说是一个数组)
但这两个地址值是一样的,不过意义不一样
16楼:匿名用户
a[0]本身是个值了,单个a代表地址。如同int a[2]= ;其中 a[0]=1
17楼:哈高妮萨
a[0]等同于同*a。
所以*a[0]等同于**a。
a[0]是第一行元素首地址。
*(*a)等同于*(a[0])等同于*(&a[0][0]),即第一行第一个元素的值。
为什么c语言中二维数组的数组名a和*a表示的是同一个值?
18楼:匿名用户
当定义二维数组a[m][n]时,数组名可以认为是二维指针,其指向二维数组的首地址。
于是a的值就是首地址的值。
而*a,就是a[0],a[0]是第一行的标记,代表第一行的首地址。
在二维数组中,所有元素都是紧密排列的,这样整个数组的首地址,第一行的首地址,和第一个元素的首地址,即a, a[0], &a[0][0] 都是相同的。
于是a和*a的值是相同的。
19楼:匿名用户
当a是二维数组名时,a即&a[0],而*a即a[0]
两者的显式的值是相同的,但是基类型是不同的
20楼:匿名用户
*a表示数组的第一个元素的值,而二维数组的第一个元素是一个一维数组。这个一维数组的首地址是a[0],所以a = *a = a[0] = &a[0][0]
21楼:艾珽
首先a[0]和*(a+0)等价,且a[i]只是一个地址(如同一维数组名只是一个指针常量)
这些你得知道。
在a[m]中,
a为二维数组名,值为0行首地址;
a[0]和*a为0行0列的地址。
*(a[i]+j)和*(*(a+i)+j)才是a[i][j]的值。
c语言二维数组中a【i】、&a【i】、a+1、*(a+1)代表的含义一样吗?如果一样为什么?
22楼:折柳成萌
它们只是值相等,但类型不相等,不能说它们相等。
a+1是int **类型,指向的是数组a的第二行的起始地址; *(a+1)是int *型,指向的是数组a的第二行第一个元素的地址。
c语言二维数组a,为什么a和(a+1)等
1楼 a 1 指针取得不就是地址吗 2楼 匿名用户 a 1 是定义的指针, 因为数组的起始地址a 0 可以用a来代替 所以a 1 和 a 1 是同一个地址 3楼 首先a代表整个数组的首地址没问题吧,a 1就是把地址下移, a 1 就是取其地址的内容。这回可以理解了吧! c语言中二维数组a i j 为...