c语言的二维数组中a j这个j为什么表示的是字节数

2021-03-11 10:56:24 字数 6500 阅读 3729

1楼:匿名用户

指针变量的增减是按地址进行的,a[i] + j应该表示的是a[i] + j*sizeof(....)。

2楼:金色潜鸟

如果有二bai维数组

short int a[4][5];

那么 a[i] 就不是du下标变量,而是地址:zhi&a[i][0]

所以 a[i]+j 是 a[i] 这个dao

单元所在地专 的 下面 的 第 j 个 元素的 地址

a[i]+j 等于属 &a[i][0] + j * sizeof(short int) -- 加的这项东西 就是 j乘2 个 字节。

老谭的书很老了。现在的 int 默认 是 4 字节。

int a[4][5]; a[i]+j 是 :&a[i][0] + j * sizeof(int) -- 加的这项东西 就是 j乘4 个 字节

char a[4][5]; a[i]+j 是 :&a[i][0] + j * sizeof(char) -- 加的这项东西 就是 j乘1 个 字节

double a[4][5]; a[i]+j 是 :&a[i][0] + j * sizeof(double) -- 加的这项东西 就是 j乘8 个 字节

c语言中 二维数组@a[i][j]的地址为什么可以表示成*(a+i)+j难道*(a+i)还表示一个地址的值?求高手详细解释

3楼:匿名用户

依据《c语言深度剖析》“多维数组与多级指针”章节 原文如下:

以数组下标的方式来访问其中的某个元素:a[i][j]。编译器总是将二维数组看成是一个

一维数组,而一维数组的每一个元素又都是一个数组。a[3]这个一维数组的三个元素分别为:

a[0],a[1],a[2]。每个元素的大小为 sizeof(a[0]),即 sizof(char)*4。

由此可以计算出 a[0],a[1],a[2]

三个元素的首地址分别为& a[0],& a[0]+ 1*sizof(char)*4,& a[0]+ 2*sizof(char)*4。亦即 a[i]

的首地址为& a[0]+ i*sizof(char)*4。这时候再考虑 a[i]里面的内容。就本例而言,a[i]内有 4

个 char 类型的元素,其每个元素的首地址分别为&a[i],&a[i]+1*sizof(char),

&a[i]+2*sizof(char),&a[i]+3*sizof(char),即 a[i][j]的首地址为&a[i]+j*sizof(char)。再把&a[i]

的值用 a 表示,得到 a[i][j]元素的首地址为:a+ i*sizof(char)*4+ j*sizof(char)。同样,可以换

算成以指针的形式表示:*(*(a+i)+j)。

4楼:问号朵朵

表达错误,差1错误:

a[i][j]的地址应该表示为:*(a+i-1)+j-1

例:int a[3][4]; 则:

*(a):表示第一行的首地址,即:(*(a))[0],表示第一行第一个元素地址,值为:*((*(a))[0])。

*(a+1):表示第二行的首地址,即:(*(a+1))[0],表示第二行第一个元素地址,值为:*((*(a+1))[0])。

*(a+2):表示第三行的首地址,即:(*(a+2))[0],表示第三行第一个元素地址,值为:*((*(a+2))[0])。

*(a+3-1)+4-1:表示最后一个元素的地址。它的值是:*(*(a+3-1)+4-1)

5楼:陈宗权

a是一个二维数组,a[i]表示其中的一行,是个一维数组,a[i][j]表示一行里面的一个元素。

*(a+i)就是a[i],是一个一维数组,当然表示一个地址,表示这个一维数组里面的第一个元素a[i][0]的地址。

6楼:涓涓细流

在这里,*a[i]是一个指针变量,它指向含j个元素的一维数组。

c语言中,二维数组的&a[i]+j和a[i]+j 一样吗?

7楼:匿名用户

void main()

bai;

int i=1,j=4;

if(a[i]+j==&(a[i][j]))printf("a[i]+j==&(a[i][j])\n");

else printf("a[i]+j!du=&(a[i][j])\n");

if(&a[i]+j==&(a[i+j]))printf("&a[i]+j==&(a[i+j])\n");

else printf("&a[i]+j!=&(a[i+j])\n");

}这些问题自

zhi己上

dao机试一下内

就行容了

8楼:匿名用户

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

9楼:匿名用户

a[i][j]的地址 因为&a[i]是a数组的首地址是第一行第一列 再加j就是第一行第j列了

应该是这样的 c预言是我3年前学的 都忘了

为什么c语言中*(a+i)+j能表示a[i][j]的地址

10楼:

int a[3][4]; //假设定义一个3行4列的二维数组,所谓二维数组就是数组的数组

a[0]、a[1]、a[2]是数组a的元素,而这个元素是数组,而不是我们通常认为的基本数据类型的数据

所以*(a+i)就是获取数组a中第i个元素,等价于a[i],而a[i]本身又是一个包含有4个int型数值的数组,a[i]是这个一维数组的数组名,我们知道数组名的本质是一个地址,是数组首元素地址,所以

*(a+i)+j就是表示下表第i行的第j个元素的地址了。所以,

*(a+i)+j表示的含义是元素a[i][j]的地址,也可以用a[i]+j来表示。

11楼:听不清啊

int a[2][3]=;

printf("%d ",*(*(a+1)+2));

以上的引用能够输出60

因为a是二维数组名,所以它是指向指针的指针(二级指针)。

*(a+1)就是a[1],它是一个一维数组,也是一维数组的首地址(指向一维数组首元素的指针)。*(a+1)+2就是a[1][2]的地址,*(*(a+1)+2)就是a[1][2]。

12楼:匿名用户

*(a+0)取出a[0]的值

a[0]的元素又是一个一维数组

因此*(a+0)取出的就是这个一维元素的首地址那么*(a+0)+0表示: 一维数组a[n]中, a+0数组元素a[0]的地址

*(a+0)+1表示一维数组的1号数组元素的地址

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

13楼:匿名用户

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

14楼:匿名用户

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

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

15楼:匿名用户

#include "stdio.h"

main()

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

这里涉及到2个问题:

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

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

16楼:

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

17楼:匿名用户

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

c语言 二维数组问题 a[i][j]中 i是列数,j是行数,那么a[0][1]又是怎么理解?

18楼:匿名用户

a[i][j],i是行数,j是列数。

a[0][1]就是第0行第1列的元素。a[0][0]当然是第0行第0个元素,即数组的首元素。

19楼:后间男孩

a[0][1]指的是第一行的第二个元素,

数组定义的时候a[i][j], 指的是有i行,j列,但是没有a[i][j]这个元素。 是从a[0][0]开始算起的

20楼:仙魔同殿

在数组中都是从0开始计数的。如:a[3][4]是包含3行4列的一个二维数组。而a[0][0]则是表示此二维数组的第一行和第一列的交汇点上的那个元素,即为此数组的第一个元素。

注意;本数组仅有12个元素,且不可出现a[3][3],a[3][4],a[2][4]等来表示数组的元素、、、

21楼:匿名用户

搞反了a[[i][j]中 i是行数,j是列数,0 1 2 3 ----j

0 a b c d

1 e f g h

2 i j k l

i就是这个意思,a[0][0]=a ,a[0][1]=b,a[0][2]=c...

22楼:匿名用户

a[0][0]:第一行第一列。

a[0][1]:第一行第二列。

……a[i-1][j-1]:第i行第j列,这是最后一个数

23楼:刪ㄗ余汜憶

行数和列数都是从零开始的

24楼:匿名用户

到这里看下,望能帮助你。

c语言中a[i][j]=i*3+j+1是什么意思啊?各位帮帮忙

25楼:曲合英李酉

你好!这是矩阵的形式,意思是a[i][j]对应的数值是i*3+j+1.

例如a[1][2]=1*3+2+1=6.

仅代表个人观点,不喜勿喷,谢谢。

26楼:匿名用户

生成一个3*3的从按照123456……顺序排列的方阵。

若是把这个公式的3换成n,就是按照123456……顺序排列的n*n的方阵。

即根据a【i】【j】=i*n+j+1(0<=i<=n-1,0<=j<=n-1)可以生成一个n*n的方阵。

27楼:匿名用户

a[i][j]表示二维数组的第i行第j列,a[i][j]=i*3+j+1是赋值语句,将i*3+j+1赋值给a[i][j]

28楼:匿名用户

这是矩阵的形式,意思是a[i][j]对应的数值是i*3+j+1.

例如a[1][2]=1*3+2+1=6.

c语言中的二维数组a[a][j]可以表述为*(*(a+1)+j),但是我看不懂这个东西啊 求解释啊

29楼:匿名用户

这个表述是有问题的,*(*(a+1)+j)没有规定首地址,*(a+1)已经表示a+1地址中的数据了,明显与数组概念不合。

a[a][j]里面数组名称和一个维度的数组的个数表示重叠了,所以我换一种方式来表示:a[y][x]。为了便于理解,假定y=3,x=2。

在数组中的数据有y行,x列;也就是3行,2列。假定第一行数据为;第二行数据为;第三行的数据为,那么数组a在内存中的数据为从首地址开始的连续6个数据,。假定首地址为0x01,那么a[0][0]的地址为0x01,对应数据“1”,该可以表示为((行数 + 0x01)+ 列数),该地址的数据可以表示为*((行数 + 0x01)+ 列数),这个表示形式,和题目中的比较接近。

以此类推,a[0][1]的地址为0x02,对应数据“2”;a[1][1]为第2行第2列,地址为0x04,对应数据0x04。

由此可以看出a[y][x]可以表示为*((x + &a) + y);&a为数组a的首地址。

不知道这样讲您是否能够理解。同时“c语言中的二维数组a[a][j]可以表述为*(*(a+1)+j)”这个题设本身是错误的,不要被其误导。

C语言,定义二维数组a,则(a+1)表示什么a+5)表示什么

1楼 倒霉孩子改名啦 a 1 相当于a 0 1 , a 5 相当于a 0 5 已经越界了 c语言 二维数组 a 1 1 和 a 5 分别表达什么? 2楼 匿名用户 a 1 a 1 那么 a 1 1 a 1 1 a 5 a 5 c语言定义了一个二维数组a 5 3 用循环实现a 0 0 a 1 0 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 为...

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

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