2015-05-28 83 views
1

我聲明一個通用的結構和這些結構的數組下面給出:澄清結構指針的陣列用C

struct A 
{ 
    int x,y,z; 
    char a,b,c; 
}; 

struct A *str_arr[5]; 

從我的理解str_arr是指向存儲塊,其存儲的指針到

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層結構可能無法在順序存儲器:以順序次序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? 

我只是想澄清一下,我的理解是正確的,我提出的所有觀點。

+0

'str_arr'是指向'struct A'的指針數組(五個指向'struct A'的指針)。 – BLUEPIXY

+0

就像'int a [42]中的整數'不必按順序排列。他們是你放在那裏的任何東西。 – juanchopanza

回答

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即乙鍵入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
+0

'&str_arr'也指向相同的內存位置 – Gopi

+0

是的,它只能使用不同的類型。這意味着從'&str_arr'和'str_arr + 0'生成的地址是相同的,但從表達式'&str_arr + 1'和'str_arr + 1'生成的地址是不同的 –

+0

是的,我知道我的意思是也可以添加到答案 – Gopi