簡體   English   中英

我不理解函數傳遞的一維數組處理

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

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