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
来打印大小值。这是不正确的,但它在你的系统上运行时可以工作。可能int
和size_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*)
。)
c
和cp
是数组,而a
和cpp
不是。真正的问题是你还期望得到什么其他的结果? - jroksize_t
应该使用%zu
。 - chris