我声明了一个通用结构和这些结构的数组,如下所示:
struct A
{
int x,y,z;
char a,b,c;
};
struct A *str_arr[5];
根据我的理解,str_arr
是一个指向内存块的指针,内存块按顺序存储指向 5 个结构的指针,因此可以通过指针算术或数组索引访问这些指针:
struct A *str_a = str_arr[1]; // points to 2nd struct?
struct A *str_b = str_arr + 2*sizeof(struct A*); // points to 3rd struct?
但是,这 5 个结构可能不在顺序内存中?
printf("%p\n", str_arr); // prints memory location of start of str_arr pointers?
printf("%p\n", str_arr[1]) // prints memory location of 2nd struct?
printf("%d\n" str_arr == &str_arr[0]) // prints 1?
我只想澄清一下,我对我提出的所有观点的理解都是正确的。
最佳答案
除了一个,其他都是正确的:
struct A **str_b = str_arr + 2 /* *sizeof(struct A*) */;
/* ^^ ^^^^^^^^^^^^^^^^^^^^^^ */
/* Not need to multiply with size. Dereference with * if your type is struct A * */
或
struct A *str_b = *(str_arr + 2);
您根据元素数量而不是字节大小给出偏移量。
str_arr + 2*sizeof(struct A*)
等价于&str_arr[2*sizeof(struct A*)]
+0 +1 +2 +3 +4
+---+---+---+---+---+
| A | B | C | D | E |
+---+---+---+---+---+
str_arr ^^^^^^^^^^^^^^^^^^^^^
&str_arr[0]^^^^
str_arr[1] = B
- str_arr为数组起始地址
- str_arr[1] 是偏移量
+1
的内容,即 B 是指向struct A
类型对象的地址。 str_arr == &str_arr[0]
同地址不同类型
正如@Gopi 所建议的,最后一点可以通过打印以下内容来证明:
- sizeof str_arr v/s &str_arr[0]
- 以下地址,
&str_arr + 1
v/sstr_arr + 1
关于阐明 C 中的结构指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30498044/