c语言数组给二级指针赋值问题求解~

学c语言指针和内存问题果然烦人,查了点搞不清楚的东西,来和大家分享一下,我已经手动修正了原文的部分细节错误哦。

提问:
char a[3][4]={“abc”,”ABC”,”123″};
char **d;
d=a;
printf(“a=%d\n”,a);
printf(“d=%d\n”,d);
printf(“a[0]=%d\n”,a[0]);
printf(“d[0]=%d\n”,d[0]);
输出a与d相同
a[0]输出的是指向a[0][0]的地址
我现在不理解的是d[0]的值为什么会是’\0cba’呢?
d所存的值不是指向d[0][0]的地址吗?
最佳回答:

首先,你理解的没错。
d和a都指向了同一块内存。
这块内存的内容是61 62 63 00 41 42 43 00 31 32 33 00
a[0]这个指针,我们知道这个指针是一个指向四个字符的字符串,所以可以得到它的值是abc\0,即61 62 63 00
而对于d指针,我们仅仅知道它是一个二维的指针,并不知道它第一维的空间是多大。于是取里面的值当作一个指向char的一维指针,一个指针占4个字节,按低位往高位存储。你可以这样理解,假设有一个char * pchar = d[0],那么 pchar的就是固定的,是一个指向0x00636261的指针。这就是你看到 “\0cba”了。

追问

可是a[0]不是应该指向’abc’的首地址,也就是指向’a’的地址吗?那a[0]的值不是存的’a’的地址吗?

回答

注意看我的说明。
假设61 62 63 00 41 42 43 00 31 32 33 00存储在0x00 88 88 88的内存单元中。a[0]是一个指向的指针,它存储的值是0x00 88 88 88,因为我们知道它是一个指向四个字节的内存的指针。如果对这一点有疑问,你可以去参考一下教材二维数组的说明。

d也是是指向0x00 88 88 88的指针
d[0]是取出0x00 88 88 88的前四个字节组成指向0x00 63 62 61。

追问

我明白你的意思啦
d[0]要取走一个char *类型的数据,大小为4字节,所以d[0]=从d开始往后取四个字节的内存内容,就是’abc\0’而又因为是小端存储所以输出的是’\0cba’
那么如果char a[3][5]=(“abcd”,”ABC”,”123″)
那d[0]应该就是’dcba’,d[1]应该就是’CBA\0‘吧

回答

完全正确。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据