【问题标题】:What are the differences between these type of Pointers? [duplicate]这些类型的指针有什么区别? [复制]
【发布时间】:2016-06-03 14:36:23
【问题描述】:

我正在用 C++ 编写代码时,我不小心将括号放在指针上,而我的程序输出发生了变化。

由于我是编程新手,所以我想知道这些类型的指针之间的区别:

int* A[n]; 
int (*A)[n];
int *(A[n]);

我在教科书中读到数组也是一种指针。

【问题讨论】:

  • 数组可以衰减为指向其第一个元素的指针,但它不是指针。例如,当您将数组传递给函数或使用指针算法时,就会发生这种衰减。
  • @JoachimPileborg 当您将数组传递给其参数是指针的函数时。它基本上是使用数组的名称来初始化或分配给执行它的指针,而不是传递给函数。
  • 学习顺时针螺旋规则,您将永远不会再对复杂的声明感到困惑。 stackoverflow.com/a/31789222/3758484
  • 感谢您的帮助 :)
  • @juanchopanza;衰减为指向其第一个元素的指针的不是名称而是数组本身。

标签: c++ arrays pointers


【解决方案1】:
int* A[n];

无论元素是什么类型,首先是一个数组。应用指针 * 后,我们知道 A 是一个 int 指针数组。

int (*A)[n];

在这种情况下,通过应用括号,指针 * 的优先级高于数组 []。那么 A 首先是一个指针,无论它指向什么。应用数组 [] 后,我们知道 A 是一个指向 int 数组的指针。

int *(A[n]);

括号不会改变任何会影响数组 [] 的优先顺序,因此删除括号将产生 int* A[n] 与您的第一种情况相同。

Are array pointers?

没有。数组是一种数据结构,它分配内存池并按顺序存储数据,其中指针指向内存池中的特定索引并引用存储在该内存位置的数据。

【讨论】:

  • 从技术上讲,数组是 C中的指针。
  • @Shark 不,数组可以衰减指向其第一个元素的指针,但数组本身不是指针。
  • @Shark sizeof 会有所不同。
  • 你是对的,数组不是指针。但是,在 C(或 C++)中,在定义数组时,分配给数组变量的值是数组中第一个元素的内存地址(即指针)。
  • @Revolver_Ocelot std::string 是一个对象,而不是一个数组(这就是问题所在)问的问题是:“在我的教科书中也读到数组也是一种指针”在 C/C++ 中,数组的括号符号只是指针运算的简写符号,并且数组变量的值始终是指向数组内存区域开头的指针。
【解决方案2】:

本文包含阅读 C 中类型声明的好示例。 http://www.unixwiz.net/techtips/reading-cdecl.html

基本上可以按照以下优先级读出类型:

  1. (通常用括号括起来)最内层类型

  2. 最右边的类型(主要是数组类型:[])

  3. 最左边的类型,除了最外面的类型(主要是指针类型:*)

  4. 最外层类型(主要是原始类型:int、char..)

例如,你提出的类型可以读出如下:

int* A[n];  // An array ([n]) of pointer (*) of int.
int (*A)[n];  // A pointer (*) of array ([n]) of int.
int *(A[n]);  // An array ([n]) of pointer (*) of int.

所以基本上,第一种和第三种是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多