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

作者&投稿:曾轰 (若有异议请与网页底部的电邮联系)
c语言中,二维数组的&a[i]+j和a[i]+j 一样吗?~

一样的 两个都是代表 a[i][j]的地址

(a+i)[j]表示地址。
a[i]表示第i行的首地址。
a[i]+j表示第i行j列元素的地址。
*(a[i]+j)代表i行j列元素的值。

在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等同于一维指针。二者类型并不相同,只是在一定条件下可以转换。

我理解问题中的这个=楼主是指相等,而且是数值上相等。这是肯定的。*a实际是*(a+0)+0,也即是a[0]+0这个地址,和a一样,其数值也是这个二维数组的首地址。
但是二者含义可不同,不能直接相互赋值。a是行指针,即a是一个大小为i的数组,其元素也是数组,大小为j。*a由上面的解释,其实质是个列指针,指向a的第一个元素(大小为j的数组)的第0个元素。

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

#include "stdio.h"
main()
{
int a99[9][9],i,j;
for(i=0; i <9; i++) //i = 0
for(j=0; j<=i; j++) a99[i][j]=i*j; //j = 0
for(i=0; i<9; i++) //i = 0
{
for(j=0;j<=i;j++) printf("%6d",a99[i][j]); //j = 0
printf("\n");
}
}
正确的写法应该是上面这样的。
这里涉及到2个问题:
1.数组声明的时候a[9]就是有9个元素的数组,a[10]就是有10和元素的数组
2.数组赋值的时候第一个元素的下标是从0开始的,即a[0],最后一个下标是声明时的数字-1,如:声明时:a[9],最后一个元素是a[8]。a[9]是超范围的。

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


C语言 二维数组&a[i]的问题
二维数组中,a[i][0]表示这个数据,a[i]表示的是a[i][0]这个数据在数组中的地址,&a[i][0]表示的是这个数据在内存中分配到的地址, 既a[i]=&a[i][0]。

在计算机C语言中,二维数组,a[][3]={1,2,3,4,5,6,7,8,9};a[0][0]=...
二维数组初始化时,可以采用上面这种方式,系统会根据总个数和第二位的长度算出第一位的长度。 上面数组中总共有9个元素,每行有3个元素,可以确定行数是3,也就是a[3][3]。另外数组中的元素是按行存放的,先存第一行,再放第二行,依次存放。还有就是数组的下表是从0开始,如果有3个元素...

c语言中二维数组的a代表是0行首地址,那*a不就是首个元素吗,为什么*a代...
哈哈!以下标从0开始说。若a是二维数组名,则a作常指针使用时,a是第0行的指针,*a是第0行的第一个元素的指针(二者值同,意义不同),**a是第0行的第0个元素的值。这可以用以下代码验证:int main(void){ int a[2][3]={1,2,3,4,5,6}; printf("%d\\n",**(a+1)); ...

二维数组中a[1]代表什么
是地址。比如说是字符类型a[][],可以看成是第二字符串的第一个字符的地址,++a[1]表示第二字字符的地址。相当于一维数组的a。

(1\/2)在计算机C语言中,二维数组,a[][3]={{1,2,3},{4,5,6},{7,8,9}...
a[0][0]=1,a[0][1]=2。这是数组初始化,第一个花括号表示第0行的三个元素值,以此类推。。。

C语言中二维数组的引用和地址有什么区别吗?比如a[i]地...
你这种情况比较复杂!一个数组名本身是一个常量地址,比如数组a[10],a就是该数组在内存分配空间的起始地址。要引用数组中各个元素。a[i]是数组专用的方法,它本身就是指a往后偏移i个长度内存空间里存放的内容,因此用&取地址就变成了该内容对应的地址;也可以用*(a+i),a+i指从地址a偏移i个长度(此长度不是字节...

为什么C语言中二维数组的数组名a和*a表示的是同一个值?
当定义二维数组a[M][N]时,数组名可以认为是二维指针,其指向二维数组的首地址。于是a的值就是首地址的值。而*a,就是a[0],a[0]是第一行的标记,代表第一行的首地址。在二维数组中,所有元素都是紧密排列的,这样整个数组的首地址,第一行的首地址,和第一个元素的首地址,即a, a[0], ...

C语言:通过指针引用多维数组一节中,二维数组a[0]和*(a+0)等价,怎么理 ...
理解这个问题的要点是: 二维数组是 元素为一维数组的一维数组。于是 a[0]是作为二维数组首元素的一维数组名,所以a[0]表示一维数组(实际是二维数组首行)首元素的地址,即,a[0]是a[0][0]的地址;数组名a是指针,指向其首元素(a[0]),即其值为&a[0](&a[0]指向a[0][0]),所以*(...

C语言中二维数组&a[i]和a[i]有什么区别?为什么这里可以用&符?_百度...
&a[i]是指向数组第i个元素的地址,而a[i]是指向该元素的值~&是取地址符,表示地址~

C语言二维数组 int a[2][3]={{1,2},{4,5}};{}里的是什么意思啊_百度知 ...
这个是一个二维数组,最外面的括号就是总的数据 里面的每个括号都是下标中1的内容,举个例子 你上面的 哪样的话 那就是a[0][0] = 1; a[0][1]=2; a[0][2] 没赋值 a[1][0] = 4 ; a[1][1]= 5;其他的都没赋值

夷陵区15191646823: c语言中二维数组a[i][j],为什么a=*a? -
束壮苦参: 在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等同于一维指针.二者类型并不相同,只是在一定条件下可以转换.

夷陵区15191646823: C语言计算数组中任一元素a[i][j]在数组中位置的公式 -
束壮苦参: 对于二维数组,则位置顺序是先行后列,比如A[2][3]在数组中的位置是第三行,第四列,所以顺序号为2乘以行号再加上列号再加一,因为对于每一行的列号都是从0开始的.所以答案是D.还不明白的话,画个表格表示二维数组就晓得了!

夷陵区15191646823: C语言的二维数组中a[i]+j这个j为什么表示的是字节数? -
束壮苦参: 如果有二维数组 short int a[4][5]; 那么 a[i] 就不是下标变量,而是地址:&a[i][0] 所以 a[i]+j 是 a[i] 这个单元所在地 的 下面 的 第 j 个 元素的 地址 a[i]+j 等于 &a[i][0] + j * sizeof(short int) -- 加的这项东西 就是 j乘2 个 字节.老谭的书很老了.现在的 ...

夷陵区15191646823: a[j]=!a[j]在c语言中是什么意思? -
束壮苦参: a[j]=!a[j]在c语言中意思是给a[j]赋与其相反的真假值.例如,如果a[j]=1,那!a[j]=0,赋值后,a[j]=0,如果,a[j]=0,那!a[j]=1,赋值语句后,a[j]=1. “!”(逻辑非)逻辑运算符.是指本来值的反值." !0" 这个逻辑表达式的值为1.(判断...

夷陵区15191646823: C++里,二维数组a[i][j],一个是字符型,一个整型数,怎么定义? -
束壮苦参: 没分也帮你,哥是好人,呵呵在C++中实现变长数组1.变长一维数组 这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组.实现变长数组最简单的是变长一维数组,你可以这样做: //文件名: array...

夷陵区15191646823: 介绍下二维数组的指针(c语言) -
束壮苦参: 请参考下~~ a[i]从形式上看是a数组中的第i个元素.如果a是一维数组名,则a[i]代表a数组第i个元素所占的内存单元的内容.a[i]是有物理地址的,是占内存单元的.但如果a是二维数组,则a[i]是代表一维数组名.它只是一个地址(如同一维数组...

夷陵区15191646823: 请问C语言中数字一维数组转换二维数组通项公式? -
束壮苦参: 公式错了:应是b[i*最大列数+j].一句话解释:二维数组内元素地址是连续的,在内存中就是一维数组.所以反过来也是一样,公式a[i][j]=b[i*行+j].就是按照二维数组的行列值在一维数组中取值.比如定义二维数组a[2][3]在内存中等同于定义一维数组b[2*3];而取a[1][2]值,对应一维数组下标5的元素,相当于取b[1*3+2](a[1][2]按连续地址数就是1行加3个元素)

夷陵区15191646823: c语言关于定义二维数组的问题 -
束壮苦参: 首先你要理解二维数组的真正含义,它的第一维就是一组数据的起始地址,第二维就是某组数据中的某个值.其次,你要知道a[][4]所表达的意思,是指二维数组a的每一维都是由4个元素组成的一维数组.而编译器可以根据你赋给a的初值个数计算...

夷陵区15191646823: C语言,如果我判断一个二维数组a[i][j]为空输出空格如何实现?我判断数组为空的时候!=NULL报错是为什么 -
束壮苦参: 整数类型,不可以使用 NULL对比,使用0试试 ——并且数组要初始化 成0,因为int类型未初始化时是随机值 ~

夷陵区15191646823: c语言:已知二维数组a[i][j],问a+i与a[i]是不是都指向数组第i行(含零行)第一个元素? -
束壮苦参: 不对.应该这样,*(a+i)和a[i]的值是相等的,他们的值都是&a[i][0],即a[i][0]的地址

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网