取消引用 int 指针与 char 指针

Dereferencing an int pointer vs char pointer

假定此代码在 C:

int a = 5;
int *b = &a;
*b = 6;

请注意,必须使用 * 取消引用 b 才能重新分配值。

但是,char 指针(字符串)不一样:

char *name = "test";
name = "test2";

name 不必取消引用。这是为什么?

"test2" 的类型已经是 char[6](依次衰减为 char*)。根本不需要在右值上使用 address-of,或取消引用左值来为要计算的类型进行赋值。

在此代码段中

int a = 5;
int *b = &a;
*b = 6;

最后的赋值将整数常量存储到指针指向的对象b。那就是对象 a 的值被改变了,而不是存储在指针 b.

中的值(地址)

在此代码段中

char *name = "test";
name = "test2";

改变的是指针本身的值,而不是指针指向的对象。所以首先指针名称指向字符串文字的第一个字符 "test" 然后它被重新分配指向字符串文字的第一个字符 "test2".

类似于下面的代码

int a = 5;
int *b = &a;

int a2 = 6;
b = &a2;

如果你想改变一个由char *类型的指针指向的对象,你可以写

char s[] = "test";
char *name = s;
*name = 'T';

在这种情况下,数组 s 将具有 "Test".

请注意,您不能更改字符串文字。也就是说,如果您将写

而不是数组 s
char *s = "test";
char *name = s;
*name = 'T';

那么代码会有未定义的行为。

另请记住,在此声明中

char *s = "test";

类型为 char[5] 的字符串文字被隐式转换为指向其第一个元素的指针。

Why is that?

因为你展示的两个例子不一样

如果你这样做了,结果是一样的:

/* your 1st example: */
int a = 5;
int *b = &a; /* b is a pointer to a what a is. */
*b = 6;

a 现在等于 6

/* your second example adjusted: */
char *a = "test";
char **b = &a; /* b is a pointer to a what a is. */
*b = "test2";

a 现在指向 "test2"