[英]Passing structures in functions when the structure comes from an “array of structures”
在“ C 編程:一種現代方法”一書中,向讀者提供了以下准代碼:
struct part {
int number;
char name[NAME_LEN+1];
int on_hand;
} part1;
void print_part (struct part p)
{
...
}
struct part inventory[100];
print_part(inventory[i]);
inventory[i].number=883;
inventory[i].name[0] = `\0`
因此,簡言之,作者創建稱為數據類型struct part
,創建了一個函數調用print_part
即作為其參數的變量p
的數據類型的struct part
,創建稱為陣列inventory
該類型的存儲100個不同的結構struct part
,和然后對上述函數進行以下調用: print_part(inventory[i])
,其中i
可以采用 0 到 99 之間的任意值。
在上面的函數調用中, inventory[i]
用作指針? 起初我認為肯定不是(因為print_part
的原型語句指定函數的參數是一個結構變量......而不是指向結構的指針)。
然而,隨后使用inventory[i].number=883
和inventory[i].name[0]='\\0'
讓我重新考慮,也許它確實起到了指針的作用。
在inventory[i].name[0]
的情況下,似乎inventory[i]
正在建立一個基地址,並且從該基地址開始, struct part
數據類型name
的第二個字段有一個偏移量。 這讓我覺得非常“指針式”。 任何澄清將不勝感激!
在上面的函數調用中,inventory[i] 是否用作指針?
不可以inventory[i]
的類型是struct part
。 它通過 value傳遞給函數,就像任何其他函數參數一樣。 *
起初我認為肯定不是(因為print_part 的prototype 語句指定函數的參數是一個struct 變量...不是指向struct 的指針)。
你這么想是對的。
但是,隨后使用
inventory[i].number=883
和inventory[i].name[0]='\\0'
讓我重新考慮,也許它確實起到了指針的作用。
我沒有看到那里的聯系。 .
在這些表達式中是訪問結構成員的運算符。 它的左側操作數必須是一個結構體,而不是指向一個的指針。 如果inventory[i]
是一個指針,那么訪問它指向的結構成員的慣用方法是使用->
運算符,形式為array_of_pointers[i]->member = value
。
在
inventory[i].name[0]
的情況下,似乎inventory[i]
正在建立一個基地址,並且從該基地址開始,結構部分數據類型name 的第二個字段有一個偏移量。 這讓我覺得非常“指針式”。
大多數對象都有關聯的存儲,它具有適當指針類型的特征地址。 當您訪問一個對象時,您可以將其視為訪問該對象地址處的內存。 當然,您可以稱其為“pointeresque”,但這不會使指定對象的表達式成為 C 意義上的指針。 指針引入了一個額外的間接級別,這在您的inventory[i]
不存在。
*也許有人在說“不是數組!” 馬上。 這是正確的,數組不按值傳遞給函數,因為它們不是在所有傳遞給函數。 在幾乎所有數組類型的子表達式出現在表達式中的上下文中,它會自動替換為 a 由指向第一個數組元素的指針。 函數調用的參數列表不屬於例外情況。 因此,甚至不可能表達將數組傳遞給函數。
C 函數中的數組類似於指針。 也就是說,當您將它們作為參數傳遞給函數時,第一個元素的地址就是傳遞的內容。 此外,數組取消引用語法array[i]
是*(array+i)
語法糖。 因此,在許多情況下,您可以將數組視為指針。
然而,必須記住,盡管有這些相似之處,數組並不是指針。 例如,這可以從sizeof
如何對待它們中看出。 如果你unsigned char array[100];
,則sizeof(array)
為 100。但是,如果您隨后分配unsigned char *ptr=array;
,那么sizeof(ptr)
是指針的大小,而不是數組的大小。
在您的情況下, inventory[i]
不是指針,而是struct part
。 如上所述,它是一個方便的表達方式,意思是*(inventory+i)
。 也就是說, inventory+i
是數組的第i
個元素的地址,而inventory[i]
通過取消引用該地址來為您提供該元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.