指向存储在结构中的数组的指针在哪里?

时间:2015-08-13 10:36:44

标签: c++ c arrays pointers implicit-conversion

我有一个看起来像这样的结构。

struct puzzle {
  int d[16]; 
}; 

我听说C / C ++中的数组和指针是相同的,所以我认为struct会存储一个指针,而指针指向一个int数组。但是,我使用调试器进行了简单的实验,看看它是如何存储的,我发现数组直接存储在结构中。

  1. 为什么数组指针不存储在结构中?
  2. 指针存储在哪里?

5 个答案:

答案 0 :(得分:5)

  

我听说C / C ++中的数组和指针是相同的

No!他们非常不同。在许多实例中,数组表达式衰减为指针,但这就是它。除此之外,数组和指针是非常不同的生物。更多地了解数组的衰减性质,以避免这样的混淆:What is array decaying?

  

为什么数组指针不存储在struct中?指针存储在哪里?

数组是struct的成员,并按预期存储。隐式获取了衰减的指针,这里没有任何东西可以存储。

struct puzzle s;
int *p = s.d;     /* p is now pointing to s.d[0] */

此处s.d隐式转换为int*。这种衰变发生的地方和不发生的地方取决于所讨论的语言。在C ++中,实例比C更多。这是为什么不在C和C ++上标记问题的另一个原因。

答案 1 :(得分:1)

我听说C / C ++中的数组和指针是相同的!!!!!

<强>阵列

数组是固定长度的对象集合,它们按顺序存储在内存中。

<强>指针

指针是引用另一个对象(或函数)的值。您可能会说它包含对象的地址。

当数组传递给函数时,它们会衰减到指针(隐式指针转换)。

  

为什么数组指针不存储在struct?

只是因为邮递员知道你家的地址,你会让他留在你身边吗?只有你的家人可以留下来,对吧?在您的情况下,数组是struct的成员。

答案 2 :(得分:1)

数组和指针在C中是不同的东西。

在许多情况下,数组变量可以被视为指针,例如当作为参数传递给带有指针的函数时:

void f(int *p);

main() {
    int a[3] = {1, 2, 3};
    f(a);
}

但是数组本身根本不是指针,它们是在某处分配的连续内存块(在你的情况下是在结构体内)。

答案 3 :(得分:1)

数组和指针是不同的类型。数组是为其元素分配的命名或未命名的内存范围。

指针是存储地址的对象。

例如,如果执行此语句

std::cout << sizeof( puzzle ) << std::endl;

表示像这样声明的结构

struct puzzle {
  int d[16]; 
};

然后输出将至少不小于值16 * sizeof(int)。

如果您将执行相同的声明

std::cout << sizeof( puzzle ) << std::endl;

表示像这样宣布的结构

struct puzzle {
  int *d; 
};

然后输出将至少等于值sizeof(int *)。

当在表达式中使用数组时,数组被隐式转换为指向其第一个元素的指针。

例如

int a[16];
int *p = a;

在第二个声明数组中,用作初始值设定项的转换为指向其第一个元素的指针。

使用数组或指针与下标运算符(如

)之间没有区别
a[i]

p[i]

因为在这两种情况下,这个表达式都被评估为

*( a + i )

*( p + i ) 

再次将数组转换为指向其第一个元素的指针,并在表达式中使用指针算法。

答案 4 :(得分:0)

数组具有顺序访问.a [0]位置= 100表示​​,a [1]将在101中,a [2]在102中。 指针不是顺序的,它们是根据地址随机存储的。