关于C语言字符串指针printf输出语法的困惑
C语言字符串指针与printf格式符的常见疑问解答
你的困惑全部来自printf格式符和对应数据类型的不匹配,以及%s格式符的特殊规则,和指针本身的逻辑无关。下面逐个解答你的问题:
疑问1:为何无法用*str_ptr打印数组首个元素的值?
不是不能打印,是你没用到正确的格式符。*str_ptr是char类型(对应字符串的第一个字符'C'),需要用%c格式符输出单个字符。误用%s会因类型不匹配触发未定义行为。
正确写法:
printf("%c", *str_ptr); // 输出 'C'
疑问2:为何无法用str_ptr打印数组首个元素的地址?
因为你用了%s格式符,它的作用是打印字符串而非地址。要打印指针地址,需用C标准中专门的%p格式符,且按标准要将指针强制转换为void*类型:
正确写法:
printf("%p", (void*)str_ptr); // 输出字符串首个字符的地址
补充:你之前打印int指针地址用%u是不标准的,同样应该用%p输出地址。
疑问3:为何str_ptr会打印出整个字符串?str_ptr不是仅指向首个元素的地址吗?
str_ptr确实只指向字符串首个元素的地址,但%s格式符的规则就是从传入的起始地址开始,逐个打印字符,直到遇到字符串结束符\0为止。这是printf对%s的设计逻辑,和指针本身的指向并不矛盾——指针还是指向第一个字符,只是格式符会顺着地址往后遍历打印。
修正后的完整代码示例
#include <stdio.h> int main() { int x[5] = {1, 2, 3, 4, 5}; int *ptr_int = x; printf("\n The address of first element in x: %p", (void*)ptr_int); printf("\n The value of first element in x: %d", *ptr_int); char *str_ptr = "Character string to be printed"; printf("\n First character of the string: %c", *str_ptr); printf("\n Address of first character: %p", (void*)str_ptr); printf("\n Whole string: %s", str_ptr); return 0; }
内容的提问来源于stack exchange,提问作者Issaki
相关产品推荐
相关产品推荐

