【问题标题】:Is variable array of pointers or pointer to array?是指针变量数组还是指向数组的指针?
【发布时间】:2018-05-17 22:18:51
【问题描述】:

我学的是C语言,对指针和数组理解有些困难。

在我阅读的教程中,我有这一行:

 char* arrP1[] = { "father","mother",NULL }; 

我的问题是什么是arrP1?

它是指向静态字符串的指针数组吗:

或者是指向字符串数组的指针:

我很困惑...arrP1 是什么?

【问题讨论】:

  • 尝试使用the clockwise/spiral rule,看看你会得到什么。
  • 另外,初始化列表应该是一个很好的提示,因为它包含 指针
  • @Someprogrammerdude:我想你可能在这里遗漏了一些东西。通常你会看到char arrp1[]char* arrp1,它们本质上是同一个意思。 char* arrp1[] 意味着别的东西。
  • @RobertHarvey 我知道char *arrp1[] 是什么意思。而char *arrp1char arrp1[] = { ... } 在语义上非常不同。
  • @RobertHarvey char *x = "foo";char x[] = "foo"; 在语义上非常不同

标签: c pointers


【解决方案1】:

arrPchar * 的数组,在本例中是大小为 3 的数组,并且您已将指针分配给初始值为 {"father", "mother", NULL} 的 c 样式字符串,它们本身就是字符数组为空终止。所以,你的第一个答案是正确的。

【讨论】:

  • So, your second answer is correct -- 因为...?您的描述向我暗示了第一个答案。
  • 您描述了第一个答案(这是正确的)。第二个答案是string(*)[],它不起作用,因为C 没有string 类型。
  • 啊,我的坏@RobertHarvey
【解决方案2】:

要找到此类声明的答案,您可以使用cdecl。它很可能会回答你。

declare arrP1 as array of pointer to char

但是,有一个东西叫做spiral rule。它还可以帮助您阅读 decleration。例如,

char *str[10]

         +-------+
         | +-+   |
         | ^ |   |
    char *str[10];
     ^   ^   |   |
     |   +---+   |
     +-----------+

-   str is an array of 10 elements
-   str is an array of 10, of pointers
-   str is an array of 10, of pointers, of type char

【讨论】:

  • 请注意,螺旋规则是一种简化,很多人find it more confusing that helpful。我更喜欢使用“从标识符开始,从内到外读取,从右侧开始(如果有括号,当然要遵守括号)”。在char *str[10] 中,给出str,然后是[10],然后是*,然后是char,所以str 是一个由十个指向char 的指针组成的数组。
  • “从标识符开始,从内向外读取,从右开始(如果有括号,当然要遵守括号)”。在 char *str[10] 中,先给出 str,然后是 [10],然后是 *,然后是 char,所以 str 是一个由十个指向 char 的指针组成的数组 是真正的螺旋规则。 @丹尼尔H
  • 在这种情况下,正如我链接的问题中的第一个答案所说,你重新定义了螺旋。您为 char **x[10][20][30] 绘制的形状看起来一点也不像螺旋形。
  • 操作,是的,没错。应该引起注意。谢谢你。 @丹尼尔H
【解决方案3】:

不确定这是否会有所帮助或使事情变得更加混乱,但 arrP1 可以是 char* 和 char** 的数组,如下所示:

void foo1(char** arr) { cout << arr << endl; }
void foo2(char* arr[]) { cout << arr << endl; }

int main() {
  char *arr[] = {"a", "b"};
  cout << arr << endl;

  foo1(arr);
  foo2(arr);
  return 0;
}

有趣的事情(我自己刚刚发现)是 foo2 不会在其堆栈上创建数组的副本,它是直接传递给 arr 的!所有 3 个 cout 都打印相同的地址。

Related SO Q&A

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多