2014-03-26 53 views
4
#include <stdint.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define MAX_PARMS 20 
#define DATA_MAX 50 
    struct s { 
     uint8_t cmd; 
     uint8_t main;   
     uint8_t sub;   
     uint8_t index; 
     uint8_t reg;    
     uint8_t sendlen;  
     uint8_t reclen; 
     uint8_t parm[MAX_PARMS]; 
    }; 
    struct t { 
     uint8_t hdr;  
     uint8_t data[DATA_MAX]; 
     uint8_t len;  
    }; 

int main() 
{ 
    struct t *p = malloc(sizeof(struct t)); 
    p->data[0] = 0xBC; 
    p->data[1] = 0xDE; 
    p->data[2] = 0xFF; 
    p->data[3] = 0x01; 

    struct s *testCmd1 = (struct s *) &p->data; 
    struct s *testCmd2 = (struct s *) p->data; 
    printf("0x%02x 0x%02x 0x%02x\n", p->data[0], testCmd1->cmd, testCmd2->cmd); 
    printf("0x%02x 0x%02x 0x%02x\n", p->data[1], testCmd1->main, testCmd2->main); 
    printf("0x%02x 0x%02x 0x%02x\n", p->data[2], testCmd1->sub, testCmd2->sub); 
    printf("0x%02x 0x%02x 0x%02x\n", p->data[3], testCmd1->index, testCmd2->index);  
    return 0; 
} 

運行上述代碼打印出:鑄造陣列以一個結構指針

0xbc 0xbc 0xbc

寫0xDE寫0xDE寫0xDE

0xff的0xff的0xff的

0×01 0×01 0×01

我想知道爲什麼& p-> data和p->數據似乎被解析到相同的地址。

在我看來,& p->數據應該是指向數據[0]地址的指針,而p->數據只是數據[0]的地址。如果情況確實如此,我會得到奇怪的值打印出來,對嗎?

理想情況下,我不認爲我會用這樣的代碼,但是我在別人的代碼,通過它跑了,這是一個測試,我寫的,看看發生了什麼事情。

如果這個問題已經回答了,我找不到它,道歉,如果是這樣的話。

+3

看看http://stackoverflow.com/questions/7707190/address-of-array-difference-between-having-an-ampersand-and-no-ampersand –

+3

甚至在這裏更好:http:// stackoverflow。 COM /問題/ 2893911 /地址的-AN-陣列地址的感-忽略待GCC –

+2

也參見[這裏](http://c-faq.com/aryptr/aryvsadr.html)和[這裏](http://c-faq.com/aryptr/ptrtoarray.html)。 –

回答

1

回答我的問題會通過,雖然聖艾蒂安評論帖子後:

「數組的地址是一樣的第一個元素的地址」

-John博德(從Address of array - difference between having an ampersand and no ampersand

即名爲「數據」的數組:&數據==數據

在我的情況

所以,& P->數據是相同的地址爲p->數據。

感謝您的快速反應,艾蒂安!

+0

沒問題;-)隨意接受你自己的答案! –

+0

顯然我必須等2天才能接受它。我不知道爲什麼,也許是因爲我剛加入... – user3466208

0

p->data在一個值上下文中使用時,因爲它是一個陣列的名字的意思&p->data[0]。這是指向數組的第一個元素的指針。

&p->data是指向整個陣列。當名稱與&sizeof使用被抑制,由此陣列名稱被轉換的指針的第一個元素的操作。

整個陣列開始於相同的存儲單元陣列,這就是爲什麼當轉換爲通用類型這些指針均包含同一存儲器地址的第一個元素。

注意:這並不是說兩個指針使用相同的內部表示的標準要求,雖然幾乎所有的系統會這樣做。