[英]I don't understand one dimensional array handling with function passing
我有一個名為record [10]的數組,其類型是表結構,例如{ int, int, long, long,char}
我有一個函數要傳遞給在循環中調用的此數組的地址:
for(i = 0 ; i<10; i++)
{
// internal resolution will be *(record + i) will fetch an address
function(record[i]);
}
我對為什么它不起作用感到困惑。 我知道這與基礎知識有關。
它開始與
for(i = 0 ; i<10; i++)
{
// then why do I need to pass this address of address here
function(&record[i]);
}
*(record + i)
實際上不是地址。 record
是一個地址, (record + i)
,但是*(record + i)
是存儲在 (record + i)
表示的地址上的值 。 因此,調用function(record[i])
與function(*(record + i))
,后者會將數組元素的值傳遞給函數,而不是指針。
語法&record[i]
不使用地址的地址。 它采用的是record[i]
的地址,它是一個對象。 花括號的優先級比&符高,因此&record[i]
等於&(record[i])
。 您可以將其擴展為&(*(record + i))
,然后簡化為(record + i)
。
更新:為了從注釋中解決您的問題,如果您自己引用數組名稱,則數組會“衰減”為指針。 如果添加方括號[]
,則會從數組中獲取一個值 。 因此,對於您的示例,假設您有一個結構數組:
struct A {
...
char abc[10];
...
} record[10];
然后,您將擁有:
record[i]
- record
數組中類型為struct A
的對象 record[i].abc
特定record
對象內的abc
數組,衰減為指針 record[i].abc[k]
-字符串中的特定字符 &record[i].abc[0]
-創建指向字符串的指針的一種方法 您不能在注釋中使用record[i]->abc
表示法,因為record[i]
是對象而不是指針。
更新2:關於您的第二條評論,無論您如何在結構中嵌套數組(以及是否直接或通過指針訪問該結構),都適用上述相同規則。 使用arrayname[index]
表示法訪問數組將為您提供數組中的一項。 使用arrayname
表示法(即, arrayname
使用數組名稱)訪問數組將為您提供指向數組中第一個元素的指針。 如果您需要有關此現象的更多詳細信息,請使用以下幾個鏈接來解釋數組及其名稱可以變成指針的方式:
您在說兩個不同的問題。 首先,您說要傳遞數組的地址,但是在代碼中,您似乎試圖傳遞特定元素的地址。 C的功能之一是,在某些情況下使用數組時,數組將自動變成指向數組第一個元素的指針。 這意味着這兩個調用是100%等效的:
function(array);
function(&array);
要獲取特定數組元素的地址,您可以做兩件事。 如上所示:
function(&array[10]);
第二個就是直接執行指針算法:
function(array + 10);
在第一種情況下, &
是必需的,因為正如您在問題中提到的, []
導致指針被取消引用- &
撤消該操作。 您似乎感到困惑的是[]
操作的真實語義。 它都執行指針算術,然后取消引用結果-您不會從中獲得地址。 這就是&
出現的地方(或直接使用array + 10
)。
您函數的簽名可能是
void function(table *); // argument's type is pointer to a table
傳遞record[i]
,傳遞一個表對象。 為了將指針傳遞給表,您必須像以前那樣傳遞&record[i]
。
您的函數需要一個指向結構的指針。 該爭論可以是該結構的單個實例,也可以是Give結構數組中的一個元素。 喜歡
struct myStruct {
int a, b;
long cL, dL;
char e;
} struc1, struc2, record[20];
函數的原型將是
function( struct myStruct *ptr);
現在您可以將結構傳遞給函數:
function( &struct1 );
// or
function( &record[ index] );
現在,您的困惑是由於誤解,即語法array[i]
也可以像對待array
名稱一樣被視為指針。
record
-於陣列的名稱給出了陣列的第一成員的地址,(指針也指向的存儲器地址),因此它可以被傳遞給該函數。 但是record[index]
,則不同。
實際上,當我們編寫record[ index]
它為我們提供的值不是指針。 因此,您正在接受指針的函數不接受它。
為了使它可以被函數接受,您將必須傳遞數組元素的地址,即
function( &record[ index ] );
在這里&
運算符給出了數組元素的地址。
或者,您也可以使用:
function( record + index );
在這里,我們知道record
是第一個元素的地址,當我們在其中添加index
時,它使用指針算法給出了相應元素的地址。
希望對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.