关于二维数组名
对于二维数组名a和*a,二者的区别在于类型不同。
对于
TYPE a[M][N];
当使用a时,可以等同于二级指针TYPE **型。
而使用*a时,等同于TYPE*型。
从概念上说,a表示二维数组a的首地址,而*a表示二维数组a第一行a[0]的首地址。这样在使用的时候就有所区别。比如 对a的操作a[4]表示a的第四行首地址,而对*a的操作(*a)[4]则代表第一行的第4个元素,即a[0][4]。
所以a和*a除了值相同外,其它的各方面都是不同的。
答:二维数组名是数组的首地址
1、众所周知一维数组名代表数组的首地址
2、那么二维数组名是否代表二维数组的首地址呢?答案是肯定的,因为二维数组的本质是一维数组,它在内存中的存储也是按照一维数组的方式存储的。所以数组名始终代表数组的首地址。
3、我们可以编程取地址确认是否正确.答案输出yes。
int main()
{
int arr[4][4] = {0};
if(arr == &arr[0][0])
printf("yes");//如果C++;cout<<"yes"<<endl;
return 0;
}
自己琢磨吧,应该能想的通。自己理解了才是自己的。
还有,不管是几维数组,它在内存中的存储地址都是连续的。
同学你好:
我看了你的问题,是这样的,a[3][2],你关于“a与a[0]指向a[0][0]对吧”的理解是不对的,后面的理解是正确的,不要怀疑自己。标签只是个记号,不占内存。
二维数组实际上就是一个数组元素为以为数组的一维数组,简单的说就是,一个以为数组中的
元素是一个以为数组,所以,例如:a【3】【2】,a表示 a 这个一维数组 a[i] 的地址,同样的道理 (a[i]) 为二位数组a[i][j]; 的地址,那么我们访问一维a[0]<=>*(a+0), a[1] <=> *(a+1);
同理,二位数组的访问也是这样只不过二位数组的地址变成了 a[i];所以我们访问时
a[1][2] <=> *(a[1] +2) <=> (*(a+1) + 2)
希望你能采纳
对于二维数组a[3][2],有人将a,a[0],a[0][0]这三者的关系用排长连长班长的关系来理解很不错具体的细节你可以在网上搜一下,很多的,在这里a[0],a,a[0][0]确实都表示的是a[0][0],不过有些区别,用a来表示是把a[3][2]当作一个一位数组来看待,其元素分别为a[0],a[1],所以a+0表示指向a[0](这里的a[0]仍然是被当作一位数组a的一个元素,而不是一个数组)所以(a+0)+2是指向一维数组a[0]的第三个元素a[0][2]的,在对其取内容*,所以*(a+0)+2就是表示a[0][2]了,你说的*(a+0)为a[0][0]是错误的,因为a为二维数组名a+0表示的是a[0]的地址,而*(a+0)就是取了a[0]的地址,不信你可以上机调试一下
简述二维数组数组名的作用
1. 作为数组的首地址,它可以配合下标运算符([])来访问数组中的元素。例如,对于一个名为arr的二维数组,arr[i][j]就表示第i行第j列的元素。这里,arr[i]其实是一个指向第i行首元素的指针,arr[i][j]就是通过这个指针来访问具体的元素。2. 数组名也可以作为指针参与一些指针运算。虽然数组...
为什么C语言中二维数组的数组名a和*a表示的是同一个值?
当定义二维数组a[M][N]时,数组名可以认为是二维指针,其指向二维数组的首地址。于是a的值就是首地址的值。而*a,就是a[0],a[0]是第一行的标记,代表第一行的首地址。在二维数组中,所有元素都是紧密排列的,这样整个数组的首地址,第一行的首地址,和第一个元素的首地址,即a, a[0], ...
关于二维数组名
还有,不管是几维数组,它在内存中的存储地址都是连续的。
C语言中一个二维数组 它的数组名是a 那a和*a有什么区别?
对于二维数组名a和*a,二者的区别在于类型不同。对于 TYPE a[M][N];当使用a时,可以等同于二级指针TYPE **型。而使用*a时,等同于TYPE*型。从概念上说,a表示二维数组a的首地址,而*a表示二维数组a第一行a[0]的首地址。这样在使用的时候就有所区别。比如 对a的操作a[4]表示a的第四行首...
关于二维数组名的问题。
理论上,指针常量要比标签要多存放一个地址;即:标签->指针->地址和标签->地址的区别;而神马标签都在系统栈中占据着一个指针以上的空间。而神马指针都在程序中占据着一个指针的空间。但是呢,系统栈是编译器在编译的时候用的,就像T T,用过就扔了,剩下的是个exe文件,那是机械码,所以呢标签...
C++二维数组名指的是数组的首地址吗?
二维数组名即为数组的首地址,不过a表示行地址,当a+1指向了数组的下一行。a的地址和&a[0][0]的地址一样,a+1的地址和&a[1][0]的地址一样 int a[2][4] = {1,2,3,4,5,6,7,8};cout << a << endl;cout << a+1 << endl;...
为什么不能把二维数组名\/行的首地址赋给指针?
所以直接把二维数组名赋给一个普通的指针变量,这个指针是指向元素aa[0]的,但实际上呢,aa[0]不是一个具体的元素,而是元素aa[0][0]的地址;所以只有把数组名赋给二级指针它才指向一个具体的元素。二维数组名不能说是二级指针,不能按指针的思路来理解二维数组,要按一维数组的思路来理解,即按照...
二维数组名为什么不能直接赋值给二级指针。
二维数组名相当于指针,但是它是一个指向数组类型(也就是整型或者字符型,具体取决于你数组的定义)。而二级指针在真正意义上也是一个指针,但它是一个指向指针的指针。在寻址时,拿整型数组举例,直接引用数组名,系统会在数组名指向的地址往后寻址2个字节得到一个整型数字。而引用二级指针时,系统会在...
C语言中二维数组名是不是可以看作指针数组名?
不可以,二维数组要看做“数组的数组”。(以如下定义为例:int a[4]; int * p;)给你个对于指针和数组的正确理解吧:定义的不同:C 里,指针和数组是不同的类型,不要把数组名看做“常指针”。所以 sizeof(a) 和 sizeof(p) 值是不同的。容易被混淆的原因:a. 都有基础类型。b. 数组...
C语言的二维数组名作参数传递会发生错误吗?
二维数组名传递不会发生错误,图中是因为你printf里多了%d