c - 当我们可以执行 char *string = "variables whose values are an address"时,指针 "string"怎么样?

标签 c string pointers

我一直是这样理解指针的:

int x = 5;
int *y = &x;

printf("%d", *y);
  • 我将 5 存储在某个内存位置,并允许自己使用 x 访问该值。
  • 我创建了一个整数指针 y,将其内存位置设置为 x 的内存位置。
  • 我打印存储在 y 保存的地址中的值。

但是,我可以同时执行 char *string = "neato" 并且它完全正常。对我来说,这看起来像是“创建一个字符指针,保存内存地址‘neato’”。这有什么意义?

此外,如果我设置它,我会尝试将其设置为 *string = "more neat" 但这会出错。相反,我需要做 string = "more neat"。第一次尝试直观上看起来像是“将字符串持有的内存地址存储的值更改为'更整洁'”,但它不起作用。第二个在我看来像是“对于‘string’持有的内存地址,将其更改为‘more neato’。这对我来说完全没有意义。

我在混淆什么?如果为了访问存储在指针上的值,我需要执行 printf("%d", *pointer)如何设置它的值不是按照这些行作为好吗?

最佳答案

一元 * 运算符有两个不同(但相关)的目的。在声明中,它表示该类型是指针类型,但并不意味着该指针正在被取消引用。

表达式中使用时,它表示引用指针。这就是为什么你的例子在它是一个声明的地方工作,但是当你取消引用它时你不能分配(因为要分配的适当类型将是一个 char,如果你无论如何都可以修改字符串文字)。

在声明之外执行此操作的等效方法如下:

const char *s = "hello"; /* initialize pointer value */
s = "goodbye"; /* assign to pointer value */

上面的初始化和赋值是等价的。

关于c - 当我们可以执行 char *string = "variables whose values are an address"时,指针 "string"怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078284/

相关文章:

c - 如何将位放入字符数组

c - 在C中初始化动态字符数组

c# - * 运算符必须应用于代码中的指针错误

c - do ... while 具有不同条件的宏/函数

javascript - 将递增数字添加到字符串使用 javascript .replace regex

java - 如何使用 .equals() 方法比较两个 StringBuffer 对象?

java - 读取 txt 文件并操作 readLine 字符串

c - 我不明白 C 中二叉树中的函数

C++ - 对于指向对象的指针 vector ,重新分配是否会导致删除和复制对象?

c - 使用 Thrust 时在 CUDA 中启动计时内核