阐明 C 中的结构指针数组

标签 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?

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

最佳答案

除了一个,其他都是正确的:

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

关于阐明 C 中的结构指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30498044/

相关文章:

javascript - PHP 脚本不断以字符串形式返回数值

c++ - 我如何使用方法来处理大量指针?

c - stm32 的系统工作台 : fatal error . .. 没有那个文件或目录

C:客户端和服务器之间的奇怪行为

Python (Numpy) 数组排序

java - 用静态方法反转数组 VS static void?

c++ - C++ 中指向对象的指针——堆栈/堆上有什么?

c - 从指针打印?

c - 我们如何在不使用循环和条件的情况下打印从 1 到 100 的数字

c - 在 fseek() 之前保持 FILE 指针的位置