我一直是这样理解指针的:
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/