gpt4 book ai didi

字符指针和 printf 函数

转载 作者:太空狗 更新时间:2023-10-29 15:09:56 25 4
gpt4 key购买 nike

我正在尝试学习指针,并编写了以下代码来打印指针的值:

#include <stdio.h>

int main(void) {
char *p = "abc";
printf("%c",*p);
return 0;
}

输出是:

a

但是,如果我将上面的代码更改为:

#include <stdio.h>

int main(void) {
char *p = "abc";
printf(p);
return 0;
}

我得到输出:

abc

我不明白以下两件事:

  1. 为什么 printf 在第二种情况下不需要格式说明符? printf(pointer_name) 是否足以打印指针的值?

  2. 根据我的理解(非常少),*p 指向包含 abc 的连续内存块。我希望两个输出相同,即

abc

是打印方式不同导致的输出不同吗?

编辑 1

此外,以下代码会产生运行时错误。为什么会这样?

 #include <stdio.h>

int main(void) {
char *p = "abc";
printf(*p);
return 0;
}

最佳答案

对于您的第一个问题,printf function (and family)将字符串作为第一个参数(即 const char *)。该字符串可能包含 printf 函数将替换为相应参数的格式代码。文本的其余部分按原样逐字打印。这就是当您将 p 作为第一个参数传递时发生的情况。

请注意,非常不推荐以这种方式使用 printf,尤其是当字符串包含来自用户的输入时。如果用户在字符串中添加格式代码,而您没有提供正确的参数,那么您将有未定义的行为。它甚至可能导致安全漏洞。

对于你的第二个问题,变量 p 指向一些内存。表达式 *p 取消对指针的引用,为您提供单个字符,即 p 实际指向的字符,即 p[0].

这样想p:

+---+      +-----+-----+-----+------+| p | ---> | 'a' | 'b' | 'c' | '\0' |+---+      +-----+-----+-----+------+

变量p并不真正指向“字符串”,它只指向内存中的某个位置,即字符串中的第一个字符“abc”。正是使用 p 的函数将内存视为字符序列。

此外,常量字符串文字实际上存储为(只读)数组,数组中的字符数加上字符串终止符的一个。

此外,为了帮助您理解为什么 *pp[0] 相同,您需要知道对于任何指针或数组 p 和有效索引 i,表达式 p[i] 等于 *(p + i) .要获取第一个字符,您有索引 0,这意味着您有 p[0],它应该等于 *(p + 0)。将零加到任何东西都是空操作,所以 *(p + 0)*(p) 相同,后者与 *p。因此 p[0] 等于 *p


关于您的编辑(您在哪里执行 printf(*p)),因为 *p 返回 p 指向的第一个“元素”的值(即 p[0])您正在传递一个单个字符 作为指向格式字符串的指针。这将导致编译器将其转换为指向具有该单个字符值的任何地址的指针(它不会将该字符转换为指向该字符的指针)。该地址不是一个非常有效的地址(在 ASCII alphabet 'a' 中的值为 97,这是程序将在其中查找要打印的字符串的地址)并且您将有未定义的行为

关于字符指针和 printf 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40002185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com