我有一个看起来像这样的结构。
struct puzzle {
int d[16];
};
我听说C / C ++中的数组和指针是相同的,所以我认为struct会存储一个指针,而指针指向一个int数组。但是,我使用调试器进行了简单的实验,看看它是如何存储的,我发现数组直接存储在结构中。
答案 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中。 指针不是顺序的,它们是根据地址随机存储的。