C语言中指针的大小以及指向指针的指针

3
如何证明以下C程序的输出结果?
#include <stdio.h>

char *c[] = {"Mahesh", "Ganesh", "999", "333"};
char *a;
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

int main(void) {
    printf("%d %d %d %d ",sizeof(a),sizeof(c),sizeof(cp),sizeof(cpp));
    return 0;
}

打印

4 16 16 4 

为什么?
如果您想尝试一下,请点击此处访问ideone链接。

9
ccp是数组,而acpp不是。真正的问题是你还期望得到什么其他的结果? - jrok
3
你使用了错误的格式说明符。 size_t 应该使用 %zu - chris
4个回答

3

a是一个指针,它代表了内存地址。在32位操作系统中,用32位(4字节)的无符号整数来表示地址。因此,sizeof(a)4

c是一个有4个元素的数组,每个元素都是一个指针,其大小为4*4=16

cp也是一个数组,每个元素都是一个指针(第一个*),它指向另一个指针(第二个*)。后面的指针指向内存中的一个字符串。因此,它的基本元素大小应该表示指针的大小,然后sizeof(cp)=4*4=16

cpp是一个指向指针的指针。它同样表示32位的内存地址。因此它的sizeof也为4


嗯...清晰了一些。主要的困惑在于**cp[]。我将其解释为指向指针(第一个*)的指针(第二个*),该指针指向数组([])。并且由于它是指针指向指针,所以它必须是4,但是根据您的说法它不是。请进一步解释一下,特别是指向指针的指针指向字符串的部分。 - Mahesha999
感谢 @KeithThompson,我已经更新了答案。 - Kun Ling
你的第一段仍然说指针被表示为32位无符号整数。它们可能具有类似的表示,但就语言而言,指针不是整数,也不是有符号或无符号的。 - Keith Thompson

3
char *c[] = {"Mahesh", "Ganesh", "999", "333"};

c 是一个 char* 指针的数组。初始化程序将其长度设置为 4,因此它是类型为 char *[4] 的数组。该类型的大小以及因此 c 的大小为 4 * sizeof (char*)

char *a;

a是一个类型为char*的指针。

char **cp[] = {c+3, c+2, c+1, c};

cp是一个char**指针的数组。初始化器有4个元素,因此它的类型为char **[4]。它的大小是4 * sizeof(char**)

char ***cpp = cp;

cpp是一个指向指针的指针,指向char,或者说是char***。它的大小为sizeof(char***)

你的代码使用%d来打印大小值。这是不正确的,但它在你的系统上运行时可以工作。可能intsize_t的大小是相同的。要正确打印size_t值,请使用%zu — 或者,如果该值不是很大,您可以将其转换为int并使用%d。( %zu格式是在C99中引入的;可能还有一些实现不支持它。)

您得到的特定大小如下:

sizeof a == 4
sizeof c == 16
sizeof cp == 16
sizeof cpp == 4

你的系统使用四字节指针,这是特定于你的系统的。其他系统可能有不同大小的指针,例如8字节很常见。几乎所有系统将所有指针类型的大小设置为相同,但不能保证这一点;例如,char* 可能比 char*** 更大。有些系统在指定内存中的字节位置时可能需要更多的信息而不是字位置。
(你会注意到我省略了sizeof表达式中的括号。这是合法的,因为sizeof是一个运算符,而不是函数;它的操作数可以是一个表达式(可能有或没有括号)或者一个在括号中的类型名,例如 sizeof (char*)。)

2

a是一个指针。而cpp也是一个指针,只不过它指向的是不同类型(指针的指针的指针)。 现在c是一个数组。你有4个元素,每个元素都是一个指针,所以你有4 * 4 = 16(如果你在x64上运行,结果可能会不同)。 对于cp也是类似的。试着将类型改为int,你就会看到差异。


0
所以你得到4 16 16 4的原因是因为'a'只是一个指针,它本身只需要4个字节(因为指针保存着32位地址,取决于你的架构),所以当你有一个**指针等于一个*指针[]时,你真正创建了一个指针数组,而且由于你初始化了4个东西,这就创建了4个指针,因此4x4=16。对于cpp,你可能会问“那么它不应该是16吗,因为它已经被初始化了?”答案是否定的,因为***指针是它自己独立的变量,仍然只是一个指针(指向指针的指针或指向指针数组的指针),并且只需要4个字节的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接