以下代码中的 cc 是保存数组 c 的基地址,还是保存来自“Hello”的字母“H”的地址?如果答案是基地址,那么为什么在执行 cc++ 之后 cc 不增加 8 个字节,因为它应该持有两个指针?
void foo(char *cc[])
{
printf("%x\n",cc);
cc++;
printf("%x\n",cc);
}
int main()
{
char *c[] = {"Hello","World"};
foo(c);
}
c
是一个指针数组。第一个指针 ( ) 指向由字母Hello和后跟空字符c[0]
组成的字符数组。指向另一个字符数组,其中包含World后跟空字符。c[1]
所以cc
会指向c[0]
如上所述。增量cc
将与上述相同c[1]
。
最好把这些东西画在纸上,以便更好地理解发生了什么。
它将被递增sizeof(char*)
,因为数组元素是char*
:
#include <stdio.h>
void foo(char *cc[])
{
printf("%x %s\n",cc,*cc);
cc++;
printf("%x %s\n",cc, *cc);
}
int main()
{
char *c[] = {"Hello","World"};
printf("sizeof(char*)=%d\n", sizeof(char*));
foo(c);
return 0;
}
输出:
sizeof(char*)=4 bf8fd910 你好 bf8fd914 世界
bf8fd914 - bf8fd910 = 4
void foo(char *cc[])
{
printf("%p\n",cc);
cc++;
printf("%p\n",cc);
}
int main()
{
char *c[] = {"Hello","World", "yo"};
foo(c);
int *p = new int[1];
int *q = p + 1;
printf("p = %p and p+1 = %p \n", p, q);
printf("sizeof(int) = %u, sizeof(dptr)=%u and sizeof
sizeof(int), sizeof(c), sizeof(*c));
}
每个指针都增加值 = 它指向的元素的大小。
因此,一个 int 指针将增加 4 个字节。
cc = {"hello", "world"} 指针将增加 16 个字节,即每个 ptr * 2
8 个字节,并且 cc = {"hello", "world", "yo"} 指针将增加 24 个字节,即 8 个字节每点 * 3
如果 cc 指针未静态初始化,即 (char **c),则 c 现在将充当普通指针。它将增加 8 个字节。
cc的数组确实有两个指针,第一个指向“hello”,另一个指向“world”!cc是一个存储指针的数组!