指向存储在结构中的数组的指针在哪里?
Where's the pointer to an array stored in a struct?
我有一个看起来像这样的结构。
struct puzzle {
int d[16];
};
听说C/C++中数组和指针是一样的,所以想到struct会存储一个指针,指针指向一个int数组。但是,我使用调试器做了简单的实验,看看它到底是如何存储的,我发现数组是直接存储在结构中的。
- 为什么数组指针没有存储在结构中?
- 指针存放在哪里?
听说数组和指针在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。
指针不是连续的,它们是根据地址随机存储的。
我有一个看起来像这样的结构。
struct puzzle {
int d[16];
};
听说C/C++中数组和指针是一样的,所以想到struct会存储一个指针,指针指向一个int数组。但是,我使用调试器做了简单的实验,看看它到底是如何存储的,我发现数组是直接存储在结构中的。
- 为什么数组指针没有存储在结构中?
- 指针存放在哪里?
听说数组和指针在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。 指针不是连续的,它们是根据地址随机存储的。