簡體   English   中英

指向整數的數組? 或指向整數數組的指針?

[英]array of pointers to ints? or pointer to an array of ints?

我注意到指針是4個字節,而整數是2個字節。 當我進行如下聲明時:

int * myGreatArray[50];

我在聲明一個包含50個指向int的指針的數組嗎? 我以為我在聲明一個指向整數數組的指針,該指針在功能上與

int ** myGreatArray = malloc(50 * sizeof(int *));

但是,本教程告訴我,這樣的聲明實際上是在創建一個指向int的指針數組,這似乎比僅僅存儲int本身效率低。

https://www.tutorialspoint.com/cprogramming/c_array_of_pointers.htm

誰能為我澄清一下?

這是運營商優先權的問題。

int * myGreatArray[50]; // array of 50 pointers to int
int (*ptArray)[50];     // pointer to array of 50 ints
int * myGreatArray[50];

確實在創建一個指向int的指針數組。 如果您想要一個指向int數組的指針,它將被寫為

int (*myGreatArray)[50];

但是,本教程告訴我,這樣的聲明實際上是在創建一個指向int的指針數組,這似乎比僅僅存儲int本身效率低。

取決於您要執行的操作。 這對於創建“鋸齒狀”二維數組很有用,其中每個“行”的長度可以不同:

for ( size_t i = 0; i < 50; i++ )
  myGreatArray[i] = malloc( sizeof *myGreatArray[i] * some_length(i) );

其中some_length(i)表示特定“行”的元素數。 它也可以用來指向現有的數組:

int foo[] = {1, 2, 3};
int bar[] = {4, 5, 6, 7, 8};
...
int *myGreatArray[] = {foo, bar, ...};

在編寫此聲明時:

int * myGreatArray[50];

和寫作一樣

int ** myGreatArray = malloc(50 * sizeof(int *));

並且您將獲得一個包含50個指向int的指針的數組,而如果使用此行:

int myGreatArray[50];

要么:

int* myGreatArray = (int*)malloc(sizeof(int)*50)

您將獲得一個由50個int變量組成的數組。 希望我的評論對您有所幫助:D,如果您仍有問題要問,我會盡快答復您。 祝你有美好的一天 ;)

聲明一個數組:

int * myGreatArray[50];

這是一個存儲50個指向int指針的數組。 請注意,它不會為這些整數分配存儲空間,而只是為指針存儲分配空間。

int arr[50];       //array of 50 integers
int * parr = arr;  /*pointer to an int, which may be
                     the beginning of an array*/

傳遞給函數:

這正是我希望發現的,因此,當將數組傳遞給函數時,將指針傳遞給數組而不是指針數組會更有效嗎? 我想是的。 –邁克爾·哈克曼

兩個函數定義:

void doStuffToArray(int ** array, size_t len)
{
  //dostuff
}

void doStuffToArray(int * array[], size_t len)
{
  //dostuff
}

在功能上是相同的。 當您傳遞數組時,該函數實際上會收到一個指向數組的指針。

要調用這些函數,可以傳遞數組(將指針傳遞給數組的開頭( 推薦 ),或者將指針傳遞給數組的起點( 不建議用於完整數組,但是將指針傳遞給數組的各個部分很有用) ):

int arr[10] = {};
doStuffToArray(arr,     sizeof(arr)/sizeof(arr[0])); //functionally identical
doStuffToArray(&arr[0], sizeof(arr)/sizeof(arr[0])); //functionally identical

傳遞指針數組時,可以使用兩個函數定義,例如argv是指向char數組的指針數組:

int main(int argc, char * argv[]){return 0;} //functionally identical
int main(int argc, char ** argv ){return 0;} //functionally identical

我的建議是使用數組表示法(與[] ),因為這是一個意圖聲明,而不是等效但更含糊的指針表示法。

如果您知道數組有多大,則argv可能已被定義為“數組數組” char argv[][] ,這很好,但無法完成。 定義函數時,只能取消定義第一個數組維,任何其他維都必須定義。 如果您知道它有多大,那么沒有什么可以阻止您創建函數的:

void doStuffToMyArray( int array[][10]){
    /*...*/
}

實際上在這次通話中

malloc(50 * sizeof(int));

沒有分配任何數組。:)沒有分配內存。 您可以用多種方式來解釋它。

例如你可以寫

int *myGreatArray =  malloc(50 * sizeof(int));

char *myGreatArray =  malloc(50 * sizeof(int));

甚至喜歡

long *myGreatArray =  malloc(50 * sizeof(int));

只要sizeof( long )等於2 * sizeof( int )

或喜歡

int ( *myGreatArray )[50] =  malloc(50 * sizeof(int));

唯一的要求是為要存儲的對象分配了足夠的內存。

如果要為類似於此聲明的數組動態分配內存范圍

int * myGreatArray[50];

那你應該寫

int ** myGreatArray = malloc(50 * sizeof(int *));
^^^^^^                                   ^^^^^

如果要為類似於此聲明的數組動態分配內存范圍

int myGreatArray[50];

那是一個由50個int類型的對象組成的數組,那么你應該寫

int * myGreatArray = malloc(50 * sizeof(int));
^^^^^                                   ^^^^^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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