我编译了以下代码:
#include <stdio.h>
int main(void) {
// your code goes here
char *consta = "ABC";
printf("Use of just const: %c\n", consta );
printf("Use of const[1]: %c\n", consta[1]);
printf("Use of whole string: %s", consta);
return 0;
}
但是,我得到的输出是:
Use of just const: P
Use of const[1]: B
Use of whole string: ABC
第二个printf和第三个printf函数调用按预期工作但是,我希望在第一次调用printf时打印'A'而不是'P'。
答案 0 :(得分:2)
consta
是包含字符串地址的指针。
你告诉printf
将其视为一个角色,这是一种未定义的行为。指针通常用于将地址存储为数字,因此通常会打印该地址的ASCII值。
您希望通过写*consta
来传递该地址的值(指针指向的地址)。
答案 1 :(得分:2)
consta
是指向角色的指针。格式说明符%c
需要类型char
(字符)†的参数,而不是char*
(指向字符的指针)。您的代码显示未定义的行为。请尝试取消引用consta
:
printf("Use of just const: %c\n", *consta);
其中*consta
绝对等于consta[0]
。
†实际上,参数的类型为int
,并由unsigned char
转换为printf()
。这与适用于具有可变参数的函数的参数提升规则有关;类型为printf()
的{{1}}的参数会在传递给char
之前提升为int
,这就是printf()
必须将其推广的原因。对于大多数程序而言,差异并不重要。
答案 2 :(得分:0)
char *consta = "ABC";
指向char
的指针指向"ABC"
,与"ABC"
的第1个元素完全相同,即'A'
。
&#34;指向&#34;表示consta
包含地址,此处为'A'
的地址。
要打印指针,会说出一个地址,请使用转换说明符%p
:
printf("Use of just const: %p\n", (void*) consta);
答案 3 :(得分:0)
我可以发现您的代码存在三个问题:
变量consta
指向一个常量字符串,因此您应该将其设为常量:
const char *consta = "ABC";
第一个print语句的第二个参数应该是字符串中的第一个字符而不是指针:
printf("Use of just const: %c\n", consta[0]);
在最后一个打印声明中,没有最终换行符。这意味着可能没有输出。
如果您希望代码符合ANSI C标准,则还需要将行注释(//...
)更改为块注释(/*...*/
)。
在编译器中启用所有警告也是一个好主意。使用流行的GCC编译器,我使用以下选项:
-ansi -fsanitize=address -g -pedantic -Wall -Wfatal-errors