C语言 取消引用整数指针与字符指针



假设 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"

相关内容

  • 没有找到相关文章

最新更新