取消引用 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"
。
假定此代码在 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".
请注意,您不能更改字符串文字。也就是说,如果您将写
而不是数组 schar *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"
。