1

以下代码中的 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);
}
4

4 回答 4

5

c是一个指针数组。第一个指针 ( ) 指向由字母Hello和后跟空字符c[0]组成的字符数组。指向另一个字符数组,其中包含World后跟空字符。c[1]

所以cc会指向c[0]如上所述。增量cc将与上述相同c[1]

最好把这些东西画在纸上,以便更好地理解发生了什么。

于 2012-04-26T13:14:14.470 回答
2

它将被递增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

于 2012-04-26T13:14:08.790 回答
1
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 个字节。

于 2012-04-26T13:26:17.480 回答
0

cc的数组确实有两个指针,第一个指向“hello”,另一个指向“world”!cc是一个存储指针的数组!

于 2012-04-27T14:18:59.660 回答