假设 C 中的代码:
int a = 5;
int *b = &a;
*b = 6;
请注意,必须使用*
取消引用b
才能重新分配值。
但是,字符指针(字符串(并非如此:
char *name = "test";
name = "test2";
name
不必取消引用。为什么?
在此代码片段中
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
将具有"测试"。
请注意,您不能更改字符串文本。也就是说,如果代替数组,您将写入
char *s = "test";
char *name = s;
*name = 'T';
然后代码将具有未定义的行为。
还要记住,在本声明中
char *s = "test";
具有char[5]
类型的字符串文本隐式转换为指向其第一个元素的指针。
"test2"
的类型已经char[6]
(反过来衰减到char*
(。根本不需要在右值上使用 address-of,也不需要取消引用左值来为要计算的类型进行赋值。
为什么呢?
因为你展示的两个例子是不一样的。
如果您这样做,则相同:
/* 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"
。