3
void say(char msg[])
{   // using pointer to print out the first char of string
    printf("%c\n", *msg);
}

void say(char msg[])
{   // using pointer to print out the memory address of the         first char of string
    printf("%p\n", msg);
}

void say(char msg[])
{   // using pointer to print out the whole string
    printf("%s\n", msg);
}

前两个是有道理的,但我不太明白第三个函数是如何工作的。我所知道的是 msg 指向字符串第一个字符的内存地址。提前致谢。

4

5 回答 5

5

%s会将地址解释msg为 C 字符串的基地址,这是一个以 NULL 结尾的 ( '\0') 字节序列,因此带有 的 printf将%s获取基地址msg并打印每个字节的等效字符msg它不会遇到 NULL 字符。

于 2012-06-27T10:22:19.290 回答
3

最后一个打印字符串..它从 msg 的内存地址开始,直到到达终止字符 '\0'

于 2012-06-27T10:21:09.830 回答
3

由于 C 字符串由 NUL 字符终止\0,因此该printf函数将采用该假设并使用指针中的地址打印出所有字符,直到\0找到 NUL 字符。

如果char传入的数组不是 NUL 终止的,您的程序可能会崩溃,因为它可能找不到 NUL 字符,并且会输出垃圾,直到它到达未分配的内存位置。

于 2012-06-27T10:21:21.333 回答
0

最后一条语句需要 String因为格式说明符是 %s。它将 msg 的基地址作为起始地址并打印所有字符,直到到达 '\0' 因为 string 是一个以空字符结尾的字符数组。

于 2012-06-27T10:31:08.227 回答
0

%P 打印出被调用的变量压入的堆栈值地址。例如,如果值 a 存储在地址 2000。并且我们在 printf() 语句中执行 %P,则输出是压入函数堆栈的地址。当我们执行 printf("%P",a); 时,a 的地址将被压入堆栈;它打印堆栈的推送值。

于 2012-12-21T18:26:40.837 回答