2016-01-20 53 views
1

我正在學習用C語言編寫的代碼。typedef,C中的數組和指針

以下部分不明確對我來說:

typedef uint8_t data_t[4][4]; 

typedef struct { 
    data_t *data; 
    ... 
} my_struct; 

,我不明白的是,什麼是data類型的東西?

另外,我想給這個變量賦值。 例如,在代碼有:

my_struct st; 
st.data = (int8_t *)array 

其中陣列被定義爲int8_t *array

我不明白這個分配是如何工作的,有人可以解釋清楚嗎?

要完成,是否可以爲我的data_t變量賦值而不將其聲明爲我的結構中的指針?

回答

4

,我不明白的是事情,什麼是數據類型?

data的類型是指向二維數組的指針。那是uint8_t(*data)[4][4]

查看C right-left rule解密C聲明。

另外,我想給這個變量賦值st.data = (int8_t *)array

在這種情況下,array必須具有與uint8_t[4][4]陣列相同的佈局。由於數組在C中是連續的,因此array必須至少有4 * 4個int8_t類型的元素。

事實上,您必須首先將array(uint8_t*)一起暗示array具有不同的類型,並且可能會造成麻煩。

請注意,這只是一個指針分配,而不是array的元素明細複製。

是否可以將值賦給我的data_t變量而不用將其聲明爲我的結構中的指針?

這是可能的,如果data不是指針,即其聲明爲data_t data;。然後使用memcpy複製到它。

2

這個聲明

typedef uint8_t data_t[4][4]; 

聲明名稱data_tuint8_t [4][4]類型的別名。

因此,在結構定義

typedef struct { 
    data_t *data; 
    ... 
} my_struct; 

構件數據是data_t *類型的指針是一樣的uint8_t (*)[4][4]

因此,它是一個指向指針的二維陣列,以類型`的對象uint8_t

陣列沒有賦值運算符。你必須將一個數組的元素複製到另一個數組中。

例如,如果你有指針的像

uint8_t *array[4]; 

另一個一維陣列可以編寫

my_struct st; 
st.data = malloc(sizeof(data_t)); 
memcpy(st.(*data)[0], array, 4 * sizeof(uint8_t *)); 

考慮到,由於data是你必須在第一指針分配內存,您將要複製uint8_t *類型的對象。