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

Where's the pointer to an array stored in a struct?

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

struct puzzle {
  int d[16]; 
}; 

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

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

听说数组和指针在C/C++中是一样的!!!!!!

数组

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

指针

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

数组在传递给函数时衰减为指针(隐式指针转换)。

Why isn't the array pointer stored in the struct?

就因为邮递员知道你家的地址,你就让他住你家吗??只有你的家人才能留下来,对吧?与您的情况相同,数组是结构的成员。

I heard that arrays and pointers are the same in C/C++

No! They're very different. An array expression decays into a pointer in many instances, but that's about it. Beyond that arrays and pointers are very different creatures. Understand more about the decaying nature of arrays to avoid confusions like this: What is array decaying?

Why isn't the array pointer stored in the struct? Where is the pointer stored at?

该数组是 struct 的成员,并且按预期存储。 decayed指针是隐式获取的,这里没有什么可存储的。

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

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

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

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

void f(int *p);

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

但是数组 本身 根本不是指针,它们是分配在某处的连续内存块(在您的例子中是在结构中)。

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

指针是存储地址的对象。

例如,如果你执行这条语句

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 被转换为指向其第一个元素的指针。

这样的下标运算符使用数组或指针没有区别
a[i]

p[i]

因为在这两种情况下,这个表达式的计算结果都像

*( a + i )

*( p + i ) 

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

数组有顺序 access.a[0] location is =100 表示,a[1] 将在 101,a[2] 将在 102。 指针不是连续的,它们是根据地址随机存储的。