澄清C中的结构指针数组

时间:2015-05-28 05:39:29

标签: c arrays pointers struct

我声明了一个泛型结构,并且这些结构的数组如下所示:

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?

我想澄清一点,我的理解与我提出的所有观点都是正确的。

1 个答案:

答案 0 :(得分:4)

一切都是正确的,除了一个:

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的建议,可以通过打印以下内容来证明最后一点:

  1. sizeof str_arr v / s& str_arr [0]
  2. 以下地址,&str_arr + 1 v / s str_arr + 1