关于C语言字符串字面量与指针的两个概念疑问
C语言字符串字面量与指针常见问题解析
问题1:为什么char* s = "hello"能用printf("%s", s)输出完整字符串
你说的没错,char* s = "hello"里的s确实只指向字符串首字符'h'的地址,但printf的%s格式符有特定处理逻辑:它会从传入的指针指向的地址开始,逐个输出字符,直到遇到**字符串结束符'\0'**才停止。
C语言里的字符串字面量(比如"hello")在编译时会被自动在末尾添加'\0'作为结束标记,所以printf能顺着指针一直读到这个结束符,从而输出整个字符串。如果手动构造一个没有'\0'的字符数组,用%s输出就会出现乱码,直到内存里碰巧遇到'\0'为止。
问题2:函数参数中二维数组赋值给指针的报错原因
首先要明确C语言的核心规则:当数组作为函数参数传递时,会自动退化为指向数组首元素的指针。
你函数里的参数char strings[ROWS][COLS],看起来是二维数组,但实际上会被编译器解析为char (*strings)[COLS]——也就是一个指向长度为COLS的字符数组的指针。
- 直接写
char* initial_p = strings时,strings的类型是char (*)[COLS],和char*类型不匹配,所以gcc会报错; - 而
*strings是对这个指向数组的指针做解引用,得到的是第一个长度为COLS的字符数组(即strings[0]),这个一维数组又会退化为指向它首元素的指针(char*类型),所以char* initial_p = *strings是合法的,等价于char* initial_p = strings[0]。
内容的提问来源于stack exchange,提问作者X.G
相关产品推荐
相关产品推荐

