【问题标题】:why there is no use of & in case of adding pointer to array of character? [duplicate]为什么在向字符数组添加指针的情况下不使用 & ? [复制]
【发布时间】:2020-06-21 17:18:55
【问题描述】:

当我们想要一个整数指针时,我们添加 &(int *p = &n)

int n=50;
int *p = &n;

,所以类似地在字符串的情况下不应该和这个一样,

char name[] = "Hello"
char *s = &name;

或者像下面这段代码,

char *s= &"Hello";

而不是这样,

char *s= "Hello";

char name[] = "Hello";
char *ptr=name;

char name[] = "Hello";
char *ptr;
ptr= name;

我不认为最后两个代码不同。

【问题讨论】:

  • char name[]char name* 是一回事。可能源于数组衰减为指针的整个想法。此外,没有c/c++ 语言。选择一个。
  • @super 这个问题完全与c/c++ 无关,所以,IMO,两个标签都适合
  • @super 实际上不是。至少在 c++ 中,如果您尝试使用字符串文字调用一个接受指针的函数,您会发现它。 char[](或任何数组类型)decays 指向指向第一个元素的指针,但在最轻微的刺激下。但是,同意该问题应该明确询问的是哪种语言。
  • @super -- 它们不是一回事。 const char *name = "abcd"; 创建一个指向文字字符串的指针。 const char name[] = "abcd"; 创建一个包含 5 个字符的数组,其中包含五个字符 'a''b''c''d''\0'
  • 由于您标记为 C++,因此您应该使用 std::string 处理文本,这样您就可以避免这些指针问题。

标签: c string pointers character


【解决方案1】:

在这个版本中:

int n = 50;
int *p = &n;

你有一个单身 int n。要创建指向它的指针,您需要使用& 获取它的地址。

另一方面,在这个版本中:

int n[50];
int *p = n;

变量nint 的数组。这具有数组名称实际上引用第一个元素的属性(即,当这样使用时,数组衰减为指针)。所以不需要&来引用地址。

完全相同的逻辑适用于char 案例:

char name[] = "Hello";
char *ptr = name;

其中name 是一个数组,因此您可以只使用变量名而不使用& 来获取指向第一个元素的指针。

【讨论】:

  • 不知道(数组衰减为指针)
  • 是的,在将数组传递给函数时也会发生这种情况。
【解决方案2】:

char *s = &name; 不起作用,因为指针类型不匹配。当您将“地址”运算符应用于数组时,您得到的是指向数组的指针。但是您正在初始化的指针变量不是指向数组的指针。它是一个指向字符的指针。

您可以使用与整数完全相同的模式来获取指向数组的指针:

char (*s)[6] = &name;

或者,当您想要一个指向数组元素的指针时,您可以使用下标运算符来获取该元素,并将 addressof 应用于该元素:

char *s = &name[0];

char *s = name; 也有效,因为数组隐式转换为指向第一个元素的指针。这种隐式转换称为衰减。

【讨论】:

    【解决方案3】:

    给定char name[] = "Hello";,如果你想要name的地址,你应该使用&name。这提供了一个指向六个 char 的数组的指针。

    编译器应该警告char *s = &name;,因为它使用指向数组的指针作为指向char 的指针,而这些指针类型不同(且不兼容)。

    在 C 中,我们通常不使用数组。相反,我们使用指向数组元素的指针。为了解决这个问题,C 会自动将数组转换为指向其第一个元素的指针,除非在某些情况下。

    因此char *s = name;name 会自动转换为指向其第一个元素的指针,即char。这就是我们不需要对数组使用& 的原因,即使我们需要使用& 来获取非数组的地址——对于数组,C 会自动给我们一个地址,所以我们不需要使用&

    虽然&name 指向数组的开头,name 指向(转换后)数组的第一个字符,它在同一个地方开始,但是指针有不同的类型。

    【讨论】:

    • char name[]已经指向六个char 的数组的指针。
    • @RobertHarvey:不,在定义char name[] = "Hello"; 之后,name 是一个由六个char 组成的数组。这可以通过打印sizeof name 的结果来看到,这将是 6。
    • 嗯,是的;它有尺寸信息。但是要获得指向数组的指针,它不是char* array = &name; 它只是char* array = name;
    • 换句话说,你为什么需要char* array = &name;
    • @RobertHarvey:根据 C 标准的规则,name 指定 数组。它不是指针。如果您愿意,您可以将其视为指针,但它不会很好地为您服务,因为编写标准的规则是将其视为数组,否则会导致问题,这是您的错误陈述不应该教给其他人。
    猜你喜欢
    • 2014-12-09
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2023-03-03
    相关资源
    最近更新 更多