指针的大小,指向C的指针

时间:2015-05-17 20:11:14

标签: c pointers sizeof

如何证明以下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 

为什么?

Here is the ideone link如果你想摆弄它。

4 个答案:

答案 0 :(得分:2)

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

c是一个char*指针数组。初始化程序为它提供了4个元素的长度,因此它的类型为char *[4]。该类型的大小,c的大小为4 * sizeof (char*)

char *a;

achar*类型的指针。

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

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

char ***cpp = cp;

cpp是指向指向charchar***的指针的指针。它的大小为sizeof (char***)

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

您获得的特定尺寸:

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

特定于您的系统。显然,您的系统使用4字节指针。其他系统可能有不同大小的指针; 8个字节很常见。几乎所有系统对所有指针类型都使用相同的大小,但这并不能保证;例如,char*可能大于char***。 (某些系统可能需要更多信息来指定内存中的字节位置而不是字位置。)

(你会注意到我省略了sizeof表达式上的括号。这是合法的,因为sizeof是一个运算符,而不是一个函数;它的操作数是一个表达式(可能是也可能不是括号内的括号)或括号中的类型名称,如sizeof (char*)。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

cpp是指针指针的指针。它也代表32位内存地址。因此,sizeof也是4

答案 3 :(得分:0)

所以你得到4 16 16 4的原因是因为'a'本身只是一个指针,它只需要4个字节(因为指针根据你的架构持有32位地址)所以当你有一个**指针是==指向一个*指针[],你真正制作了一个指针数组,并且因为你创造了4个创造4个指针的东西,因此4x4 = 16.而对于cpp,你可能会问“好”难道它不会是16,因为它是初始化的吗?“答案是否定的,因为***指针是它自己的独立变量,仍然只是一个指针(指向指针的指针,或指向指针数组的指针),并且只需要4个字节的内存。

相关问题