12

假设我的C 程序中有以下代码:

#include <stdio.h>

void PrintSomeMessage( char *p );

int main(int argc, char *argv[]) {
    char arr[10] = "hello";
    PrintSomeMessage(&arr[0]);
    return 0;   
}

void PrintSomeMessage(char *p)
{
    printf("p: %s",p);
}

为什么这个输出会是整个单词“hello”而不是单个字符“h”?

不过,我明白,如果我"%c"在格式化程序中输入 a,它只会打印一个字母。但是,这个地址中每个字母的内存地址还是不同的。拜托,有人给我解释一下吗?

4

2 回答 2

27

但是,这个地址中每个字母的内存地址还是不同的。

内存地址不同,但作为字符数组,它们是连续的。当您传递第一个元素的地址并使用%s时,printf将打印从给定地址开始的所有字符,直到找到为止'\0'

于 2013-06-06T12:33:07.960 回答
5

数组的情况下,基地址(即数组的地址)是数组中第一个元素的地址。数组名称也充当指针。

考虑一排房子(每个都是数组中的一个元素)。要识别行,您只需要第一个房子的地址。您知道每个房子后面跟着下一个(顺序)。获取第一个房子的地址,也会给您该行的地址。

如果是字符串文字(在声明中定义的字符数组),它们会自动附加\0.

printf使用格式说明符和提供的地址打印。因为,您使用%s 它从第一个地址打印(使用算术递增指针)直到 '\0'

于 2013-06-06T12:44:02.013 回答