#include<stdio.h>
int main()
{
char *s[] = {"ice","green","cone","please"};
char **ptr[] = {s+3,s+2,s+1,s};
char ***p = ptr;
printf("%s\n",**++p);
printf("%s\n",*--*++p + 3);
printf("%s\n",*p[-2]+3);
printf("%s\n",p[-1][-1] + 1);
return 0;
}
我的疑问是ptr会分配多少字节的内存?
一些注意事项:
为什么在这里提到的答案中将地址设为6000、6001、6002、6003?
请提供相同的清晰度。
char **ptr[] = {s+3,s+2,s+1,s};
ptr
是指向 char 的指针的 4 元素数组。
所以它的大小是
4 * sizeof(char **)
,在指针长度为 8 字节的系统上,它将是 32 字节:https://godbolt.org/z/WMcojE858
在指针长度为 4 个字节的 32 位系统上,它将是 16 个字节:https://godbolt.org/z/4Ef4n81xf
并且由于每个指针都是无符号整型数据类型,因此大小 ptr 数组应为 =(元素数量 x 指针大小)
不,它不是整数类型——它是指针类型。
address of ptr[3] = 6024
这个指针是 8 个字节长,所以最后一个字节占用将是 6031,这使得 32 个字节长的指针数组
为什么在这里提到的答案中将地址设为6000、6001、6002, 6003?
我不知道你提到的答案是什么,但指针运算不适用于仅对整个指针类型的字符(在我们的例子中
char **
)。这可能会让你感到困惑
所以
ptr + 1
是 NOT 一个字节超出 ptr
只有一个 char **
超出 ptr
。 ptr + 1
与 &ptr[1]
相同或 *(ptr + 1)
等同于 ptr[1]
变量
ptr
被声明为数组类型
char **ptr[] = {s+3,s+2,s+1,s};
数组的大小等于数组中元素的数量乘以数组元素的大小。
由于上面显示的数组声明中的元素数量没有明确指定,因此它由初始化器的数量决定。在声明的情况下,元素的数量等于
4
.
所以数组的大小等于
4 * sizeof( char ** )
。指针的大小是实现定义的,取决于所使用的系统。它通常可以等于 4
或 8
.
所以数组的大小等于
16
或32
字节。
至于你关于元素地址的问题
ptr[i]
那么如果你将运行这个简单的程序
#include <stdio.h>
int main( void )
{
const char *s[] = {"ice","green","cone","please"};
const char **ptr[] = {s+3,s+2,s+1,s};
const char ***p = ptr;
for ( size_t i = 0; i < 4; i++ )
{
printf( "&ptr[%zu] = %p\n", i, ( void * )( ptr + i ) );
}
}
那么它的输出可能看起来像
&ptr[0] = 0x7fff8f42d400
&ptr[1] = 0x7fff8f42d408
&ptr[2] = 0x7fff8f42d410
&ptr[3] = 0x7fff8f42d418
对于指针大小等于
8
字节的系统。
至于存储在表达式中的值
ptr[i]
然后它们是实现定义的并指定字符串文字的第一个字符的地址。例如,相等的字符串文字可以存储为一个字符数组或不同的字符数组,具体取决于编译器选项。
如果你有一个声明为 like 的数组,请注意根据指针算法
T a[N];
其中
T
是类型说明符,当相邻元素 &a[i+1] - &a[i]
的地址之间的差异等于 sizeof( T )
.