【问题标题】:Not using '&' when passing a pointer [duplicate]传递指针时不使用“&”[重复]
【发布时间】:2020-07-25 10:25:21
【问题描述】:

"some_function" 接收一个指向字符的指针——它的定义如下:

void some_function(char *c);

据我所知,当我们想要调用“some_function”时 - 我们应该使用 '&' 运算符将 an 传递给参数:

some_function(&some_char);

但我见过“some_function”直接接收字符串的工作示例:

some_function("some string");

它是如何工作的?是否推荐这种做法?

【问题讨论】:

    标签: c string pointers


    【解决方案1】:

    在 C 中,所有文字字符串实际上都是(只读)字符数组,包括结尾的空终止符。

    与 C 中的所有数组一样,它们可以衰减为指向其第一个元素的指针。

    这意味着只要需要char *,就可以使用所有字符串文字。


    它类似于(但不等同于)拥有:

    char some_string[] = "some string";
    some_function(some_string);  // equal to some_string(&some_string[0])
    

    【讨论】:

    • 更像是:const char *some_string = "some string"; some_function(some_string);。 (在您的代码中,some_string 可以合法修改,但在 OP 中并非如此-直接传递字符串文字)。
    【解决方案2】:

    在 C 中,字符串实际上是一个字符数组。字符串可以这样声明:

    // # 1
    char *some_string = "some string";
    // # 2
    char some_string[] = "some string";
    

    并像这样传递给函数:

    some_function(&some_string[0]);
    some_function(some_string);
    // or if it's just string literal
    some_function("some string");
    

    他们都有char *类型。

    【讨论】:

    • 我认为您至少应该提及您的定义#1 和#2 有何不同。一个是指针,另一个为内容分配空间。
    【解决方案3】:

    据我所知,当我们想要调用“some_function”时 - 我们应该使用 & 运算符将 an 传递给参数。

    请注意,对于数组,您应该省略 & 运算符,因为当作为参数传递给函数时,数组会衰减为指向其第一个元素的指针。

    但我见过“some_function”直接接收字符串的工作示例:

    some_function("some string");

    它是如何工作的?是否推荐这种做法?

    字符串文字基本上存储在不可修改的char数组中(likely but not necessary in read-only memory)。

    当您使用像其周围的"s 所指示的字符串文字时,它会衰减为指向其第一个元素的指针,该元素的类型为char *

    所以,使用这种技术没有问题。

    请注意,您不能修改字符串文字,因此任何在 `some_function 中更改 "some string" 内容的尝试都会调用未定义的行为。

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 2019-12-13
      • 2012-01-24
      • 2016-08-26
      • 1970-01-01
      • 2011-06-14
      • 2019-02-13
      • 2014-10-12
      相关资源
      最近更新 更多