簡體   English   中英

當結構來自“結構數組”時在函數中傳遞結構

[英]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=883inventory[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=883inventory[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM