c语言中数组中首地址用字母表示,在二维数组a[ i ][ j ]中*(a+i)表示第i行的首地址,为, c语言中二维数组a[i][j],为什么a=*a?...

导航:网站首页 >

在二维数组a[ i ][ j ]中*(a+i)表示第i行的首地址,为, c语言中二维数组a[i][j],为什么a=*a?

在二维数组a[ i ][ j ]中*(a+i)表示第i行的首地址,为什么不是表示第i... , c语言中二维数组a[i][j],为什么a=*a?

匿名网友:

依据《c语言深度剖析》“多维数组与多级指针”章节 原文如下:以数组下标的方式来访问其中的某个元素:aij。

编译器总是将二维数组看成是一个一维数组,而一维数组的每一个元素又都是一个数组。

a3这个一维数组的三个元素分别为:a0,a1,a2。

每个元素的大小为 sizeof(a0),即 sizof(char)*4。

由此可以计算出 a0,a1,a2三个元素的首地址分别为& a0,& a0+ 1*sizof(char)*4,& a0+ 2*sizof(char)*4。

亦即 ai的首地址为& a0+ i*sizof(char)*4。

这时候再考虑 ai里面的内容。

就本例而言,ai内有 4个 char 类型的元素,其每个元素的首地址分别为&ai,&ai+1*sizof(char),&ai+2*sizof(char),&ai+3*sizof(char),即 aij的首地址为&ai+j*sizof(char)。

再把&ai的值用 a 表示,得到 aij元素的首地址为:a+ i*sizof(char)*4+ j*sizof(char)。

同样,可以换算成以指针的形式表示:**a+i+j)。

匿名网友:

在内存中二维数组是一行一行存储的,即本例中4个4个的存储。

那么数组的开头,即可以是数组第一个元素的位置,可以是数组的首地址,也可以是第一行的首地址。

如图即a00 是二维数组的第一个元素,也是第 0 行的第一个元素,他们的位置是一样的所以地址也必然是相同的。

a = a0 = &a0 = &a00;举例: i=1; ai 就表示的是第 i 行的首地址,也就是 ai0这个元素所在的地址;&ai 取得ai0的地址,它和首地址是一个位置,那么地址肯定是相同的;a+i,就是a 偏移i 个单位,在本质上是和 ai一样的,ai的理解就应该是a 偏移i 个单位;

匿名网友:

int a34; //假设定义一个3行4列的二维数组,所谓二维数组就是数组的数组a0、a1、a2是数组a的元素,而这个元素是数组,而不是我们通常认为的基本数据类型的数据所以*a+i就是获取数组a中第i个元素,等价于ai,而ai本身又是一个包含有4个int型数值的数组,ai是这个一维数组的数组名,我们知道数组名的本质是一个地址,是数组首元素地址,所以*(a+i)+j就是表示下表第i行的第j个元素的地址了。

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

匿名网友:

要回答你的这个问题,不妨先根据你的问题先编写一段小的示例程序:#include #include using namespace std;int a34;int main(){memset(a, -1, sizeof(a));int i;for( i = 0; i printf("&ai0 = %d\n", &ai0);printf("a + i = %d; *(a + i) = %d;\n", a + i, *( a + i));printf("ai = %d; &ai = %d;\n", ai, &ai);printf("\n");}}这段示例程序在我本地上运行的结果为:&ai0 = 4214816a + i = 4214816; *(a + i) = 4214816;ai = 4214816; &ai = 4214816;&ai0 = 4214832a + i = 4214832; *(a + i) = 4214832;ai = 4214832; &ai = 4214832;&ai0 = 4214848a + i = 4214848; *(a + i) = 4214848;ai = 4214848; &ai = 4214848;我想看到这个运行结果,你已经有所了解了,下面我再详细说一下:指针量a作为一个二维数组的指针量,其本质是一个“指向指针的指针”为了方便,下面称其为双重指针,或者你可以理解为a为int**类型的指针量。

当a做加减运算时,得到的结果仍然是一个“双重指针”,即a + i是一个双重指针,它是一个指向了原数组第i行的起始位置的双重指针。

而*a + i原来的双重指针解引用后得到的一个指针变量,他是一个指向了原数组第i行的起始位置的“单重指针”。

可以看出,a + i和*a + i尽管数据类型不同前者为双重指针,后者为单重指针,但是他们指向同一块内存地址,因此作为指针量,他们的值是相等的。

注意,仅仅是说,他们的值在数学上是相等的,并非说“他们是等价的”。

你的第二个问题亦是同理:首先,作为C语言的操作符,本身即具有“解引用”的语义。

明白的说,就是ai与*a + i是完全等价的,而&ai即等价于a + i。

由于易知a + i和*a + i在数值上相当,那么进行等价带花可以知道,&ai和ai在数值上相等。

当然,此处仍非等价关系。

至于指向行的指针,所指的就是指向行首位置的指针量。

至于你的最后一个问题,正如我刚才一直强调的那样,等号两端仅仅是数值上的相等,而非等价关系,因此无法按照你所设想的方式进行归纳推导。

匿名网友:

/*a &a &a00都是指着数组的首地址差别见代码部分,输出结果*/#include using namespace std;int main(){int a33={{1,2,3},{4,5,6},{7,8,9}};/************************************************************/cout

问题推荐

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值