首页 > 解决方案 > 如果给定一个值而不是地址,C 中的指针会发生什么?

问题描述

所以我的代码片段是这样的

char* ptr = "Hello";

这里ptr指向什么?我认为它指向“H”。

为什么这个指针ptr的行为不像普通指针?

因为当我写的时候printf("%s" ,*ptr),它没有给我价值,而是引发了一个错误。然而,当我写printf("%s" , ptr)它时,它给了我“Hello”作为输出。

为什么会发生这种行为?

指针中实际存储的是什么ptr

标签: cpointers

解决方案


您在这里的核心误解可能是您认为“字符串”是您可以在程序中传递和执行操作的东西,就像您可以使用 int、float 或结构一样。当你试图写

printf("%s", *ptr);

也许你认为那ptr是一个指针,但你不想打印指针,你想打印指针指向的整个字符串,所以你把它*放在那里“获取指针的内容”。

您的推理中的缺陷是,在 C 语言中,没有字符串可以作为一个整体传递printf给它以供打印。

当然,C 确实有字符串,但它们是作为数组实现的。数组是 C 中的二等公民:您绝对不能将它们四处传递,而是像使用 int、float 和 struct 那样处理它们。

每当您尝试对数组做某事时,您得到的(无论您是否想要,无论您是否意识到)都是指向数组第一个元素的指针。

因此,即使我们说 in 的%s格式printf是用于打印“字符串”,printf想到您会将整个字符串传递给它——因为 printf 知道您无法这样做。因此,相反,%s格式printf期望接收指向字符串中第一个字符的指针


推荐阅读