c - 如果给定一个值而不是地址,C 中的指针会发生什么?
问题描述
所以我的代码片段是这样的
char* ptr = "Hello";
这里ptr
指向什么?我认为它指向“H”。
为什么这个指针ptr
的行为不像普通指针?
因为当我写的时候printf("%s" ,*ptr)
,它没有给我价值,而是引发了一个错误。然而,当我写printf("%s" , ptr)
它时,它给了我“Hello”作为输出。
为什么会发生这种行为?
指针中实际存储的是什么ptr
?
解决方案
您在这里的核心误解可能是您认为“字符串”是您可以在程序中传递和执行操作的东西,就像您可以使用 int、float 或结构一样。当你试图写
printf("%s", *ptr);
也许你认为那ptr
是一个指针,但你不想打印指针,你想打印指针指向的整个字符串,所以你把它*
放在那里“获取指针的内容”。
您的推理中的缺陷是,在 C 语言中,没有字符串可以作为一个整体传递printf
给它以供打印。
当然,C 确实有字符串,但它们是作为数组实现的。数组是 C 中的二等公民:您绝对不能将它们四处传递,而是像使用 int、float 和 struct 那样处理它们。
每当您尝试对数组做某事时,您得到的(无论您是否想要,无论您是否意识到)都是指向数组第一个元素的指针。
因此,即使我们说 in 的%s
格式printf
是用于打印“字符串”,printf
但没想到您会将整个字符串传递给它——因为 printf 知道您无法这样做。因此,相反,%s
格式printf
期望接收指向字符串中第一个字符的指针。