【问题标题】:Dereferencing an int pointer vs char pointer取消引用 int 指针与 char 指针
【发布时间】:2019-12-27 17:40:05
【问题描述】:

假设这段代码在 C 中:

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

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

但是,char 指针(字符串)并非如此:

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

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

【问题讨论】:

  • 当你取消引用一个指针时,你引用了指针指向的对象。所以在上面的赋值中,你将 6 赋值给变量a,而不是指针b
  • 因为name 的值不是char,而是char*

标签: c pointers c-strings dereference string-literals


【解决方案1】:

在这段代码中sn-p

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

最后一个赋值将整数常量存储到指针b 指向的对象。即对象a 的值被更改,而不是指针b 中存储的值(地址)。

在这段代码中sn-p

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] 类型的字符串文字被隐式转换为指向其第一个元素的指针。

【讨论】:

    【解决方案2】:

    "test2" 的类型已经是char[6](它又会衰减为char*)。根本不需要在右值上使用 address-of,或者取消引用左值来为类型进行分配。

    【讨论】:

      【解决方案3】:

      这是为什么呢?

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

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

      /* 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"

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        • 2018-04-05
        • 2014-11-03
        • 2013-12-06
        • 1970-01-01
        相关资源
        最近更新 更多