❶ 在c语言中怎么样得到二维数组的首地址哦
就这道题来说,虽然编译器给出了对p=a的警告,但是程序仍然可以正确的运行。因为你的程序中并没有对p进行二次解引用。详细来说,执行p=a时,由于两者类型不同,编译器将a转换成指向整型的指针,然后复制给p,所以p可以正确地指向二维数组的首元素a[0][0]。 最后我再解释一下一些表达式的意思: a,a[0],&a[0][0],p均表示该二维数组的首地址。 &a[1][0],a[1],a+1,p+3均表示该二维数组中第二维的首地址。 a[0][1],a[0]+1,p+1均表示该二维数组中的第二个元素的地址。 p+n表示第n+1个元素。 理解上只要知道a[i][j]是元素,a[i]和p是指向整型的常指针,a是指向指向整型的常指针的常指针,也是数组的首地址就可以了。
❷ 关于c语言中二维数组的地址问题
C语言多维数组左边下标变化慢,右边快。内存存储越靠右的下标越相邻。
❸ C语言二维数组地址问题
1、&a[0][0]为0行0列元素的首地址,a[0]+n为0行第n个元素地址,那么a[0]是表示0行首元素地址吗?
>>正确, a[0]就是0行首地址.
&a[0]是零行的首地址,实际上行的地址也只有一个,也无所谓0行的首地址吧?
>>&a[0]值上, 是和a[0]相同的, 不过类型不一样. a[0]等效于int *型,实际上是指向一个元素. 而&a[0]是行指针, 指向一行.所以,a[0]+n和&a[0]+n是完全不同的.
+n相当于元素位移了n个位置吗,所以代表第n个元素地址吗?
>>+n取决于原始指针的类型. 如果是a[0]+n 移动的是n个元素.而&a[0]+n就是移动n行了.
然后*(a[n]+m)就表示n行第m个元素了?
>>这句没错. 任何情况下, *(p+n)都等效于p[n]
2、书中写a+n表示第n行的首地址,那是相当于&a[n]吗,a不是表示数组首个元素地址吗,怎么+n不是元素位置改变,却是位移了行?
>>这个上面说过了, 核心在于指针的类型. 二维数组int a[M][N]的数组名a, 本质上是常量的int (*)[N]类型, 也就是数组指针. 移动的时候是整行移动的.
还是a+n表示n行首个元素的地址?为什么
>>同上
*(a+n)与a[n]是等价的,原理是什么,*(*(a+n)+m)怎么也能表示n行m列元素呢?
>>*(a+n)与a[n]等价, 这个是C语言的一个规则. 其本质是, 当编译器遇到a[n]这样的形式时, 实际上是翻译成*(a+n)进行编译的. 这种可以用一个很少见的形式来验证.你定义
int a[4]={1,2,3,4}; 然后输出
printf("%d ", 3[a]);
对, 就是把数组名放进[], 实际上会输出a[3]
❹ C语言中如何用指针运算符来表示一个二维数组的元素及地址
二维指针,就是说第一维是指针,第二维还是指针;
拿*(*(a+i)+j)来说:a是数组的首地址吧,然后+i,就是说a地址向后偏移i位。就是a+i的地址了,注意,这里a+i只是地址,用*符号取出该地址的数据,就是*(a+i),这里*(a+i)就是第一维指针,它指的是地址,不是数据。
而且后面的*(a+i)+j就是说以*(a+i)为首地址,偏移j位,然后使用*取内容,这里就是第二维了,取到的数据就是实际数据了
❺ c语言,关于对数组名取地址
准确的说法,是变成了二级指针。
而二级指针,是指向指针地址的指针,变相相当于一个第一维度只有1的二维数组。
其中的根源,在于C语言中,声明一个数组其实相当于申请了一个定长的指针(存储位置不同,使用上还是有区别的),你可以将数组名当做指针使用,而反过来,也可以将一个指针,以数组的方式合法访问其成员。而二维数组的声明后,A[1][3],之后A[0]是一个一维数组,同样A[0]保存的,也是这个一维数组的地址,A保存的是A[0]的地址,和二级指针相同。
❻ C语言 二维数组 取首地址 所得到的 地址 和 居然首地址相同
这是很正常的。二维数组的地址就是它首元即第一个一维数组a[0]的地址,而一维数组a[0]的地址又是它的首元a[0][0]的地址。所以三者是相同的。
❼ C语言:定义一个2行3列的浮点型二维数组,并将每个元素的地址输出
您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!展开全部
#include<stdio.h>
void main()
{
int a[2][3],i,j,sum=0;
printf("请输入数组元素:\n");
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
printf("每行的和分别为:\n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
sum += a[i][j];
}
printf("%d\n",sum);
sum=0;
}
printf("每和分别\n");
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
sum += a[j][i];
}
printf("%d\n",sum);
sum=0;
}
}非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!
❽ c语言的二维数组地址问题
答:
二维数组
a[3][4]中,a[1]+1是数组a[1]的第2个元素的地址,a[0]+4是数组a[0]的第5个元素的地址,但a[0]只有4个元素,所以a[0]+4就是a[1]首元素的地址,因此这是两个不同的地址。
另外,也可以将二维数组a[3][4]看成一维专数组a[12],那么原来的a[1]+1就是
一维数组
的a[5]的地址,而原来的a[0]+4是一维数组的a[4]的地址,由此可见属,这是两个不同的地址。
❾ c语言二维数组地址问题 求大神讲解!!
图中的首地址应该是16进制0x2000,表述不太严谨。你的分析不正确,a[1][0应该比首地址偏移4个int,也就是偏移16字节。0x2010比0x2000正好大16。