簡體   English   中英

int指針是一個int數組嗎?

[英]Is an int pointer an array of ints?

我一直在關注一些聲明int指針的例子

int *myInt;

然后將該指針轉換為數組

myInt = (int*)malloc(1024);

這檢查出來

myInt[0] = 5; 
cout << myInt[0]; // prints 5
myInt[1] = 7;
cout << myInt[1]; // prints 7

我認為一個int指針是指向int的指針,而不是其他任何指針。 我知道指向字符串的指針只是指向字符串的第一個字符,但它看起來像是在使用一組int的同類事件。 但是,如果我們想要的是一個int數組,為什么不只是創建一個int數組而不是指向int的指針?

順便說一下,我對它在C而不是C ++中是如何工作感興趣。 這是在C ++文件中,但相關代碼在C中。

int指針是一個int數組嗎?

沒有。

我認為一個int指針是指向int的指針,而不是其他任何指針

那就對了。 指針是指針,數組是數組。

令你困惑的是,指針可以指向數組的第一個元素,而數組可以衰減成指向第一個元素的指針。 更令人困惑的是:指針具有數組用於索引的解引用和指針算法相同的語法 也就是說,

ptr[i]

相當於

*(ptr + i)

如果ptr是一個指針。 當然,類似地, arr[i]也是arr數組的 i 元素。 相似性產生於指針和數組的共同特性:它們都用於間接訪問(可能是塊)內存。

這種強關系的結果是在某些情況下 (並且有一些約束 ),可以使用數組和指針,就好像它們是可互換的一樣。 這仍然不意味着它們是相同的,但它們具有足夠的共同屬性,因此它們的使用通常看起來“相同”。

有一種替代語法可以訪問指針指向的項 - 方括號。 這種語法允許您通過指針訪問數據,就好像指針是一個數組(當然,指針不是數組)。 表達式a[i]只是寫作*(a+i) *的另一種形式。

當您分配動態存儲並將其分配給myInt ,您可以像使用動態數組一樣使用指針,該數組可以在運行時更改大小:

myInt = malloc(1024*sizeof(int)); // You do not need a cast in C, only in C++
for (int i = 0 ; i != 1024 ; i++) {
    myInt[i] = i; // Use square bracket syntax
}
for (int i = 0 ; i != 1024 ; i++) {
    printf("%d ", *(myInt+i)); // Use the equivalent pointer syntax
}


*順便說一句, +交換性讓你寫4[array]而不是array[4] ; 不要那樣做!

排序,技術上沒有。 int指針確實指向int。 但是一個int數組在內存中是連續的,所以可以使用*(myInt+1)引用下一個int。 數組符號myInt[1]是等價的,因為它使用myInt指針,向它添加1個單位(int的大小),並引用該新地址。

所以一般來說,這是真的:

myInt[i] == *(myint + i)

因此,您可以使用int指針訪問該數組。 請注意注意'\\0'字符並停止。

int指針不是int數組。 但是你的更大問題似乎是為什么需要數組和指針。

數組表示數據存儲器中的實際存儲。 分配該存儲后,無論是引用使用數組表示法存儲的數據還是指針表示法,都沒有顯着差異。

但是,也可以在不使用數組表示法的情況下分配此存儲,這意味着不一定需要數組。 數組的主要好處是方便地分配小塊內存,即int x[20]和稍微更方便的符號array[i]而不是*(array+i) 值得慶幸的是,無論array是來自數組聲明還是僅僅是指針,都可以使用這種更方便的表示法。 (基本上,一旦分配了一個數組,從該點開始的變量名稱與指定指向數組中第一個值的內存中位置的指針沒有什么不同。)

請注意,如果您嘗試在陣列中直接分配太大的內存塊,編譯器會抱怨。

陣列:

  • 表示分配的實際內存
  • 數組的變量名稱與引用數組開始的內存中的點的指針相同(並且變量名稱+ 1與引用數組的第二個元素開始的內存中的點的指針相同(如果存在),等)
  • 可以使用數組表示法訪問數組中的值,如array[i]

指針:

  • 是一個存儲內存位置的地方
  • 可以指代在數組中分配的內存
  • 或者可以引用已經由malloc函數分配的malloc
  • 存儲在指針指向的內存中的值可以通過解引用指針來訪問,即*pointer
  • 由於數組的名稱也是一個指針,數組中第一個元素的值可以通過*array訪問,第二個元素的值可以通過*(數組+ 1)等訪問。
  • 可以向指針添加或減去一個整數,以創建一個新指針,該指針指向程序分配的同一內存塊中的其他值。 例如,數組+5指向存儲值數組[5]的內存中的位置。
  • 指針可以遞增或遞減以指向具有相同內存塊的其他值。

在許多情況下,一種符號比另一種符號更方便,因此兩種符號都可用且很容易相互交換是非常有益的。

她們不一樣。 這是明顯的區別。

int  array[10];
int  *pointer;

printf ("Size of array = %d\nSize of pointer = %d\n",
    sizeof (array), sizeof (pointer));

結果是,

Size of array = 40
Size of pointer = 4

如果你做“數組+ 1”,結果地址將是數組[0] + 40的地址。如果你做“指針+ 1”,結果地址將是指針[0] + 4的地址。

數組聲明導致編譯時內存分配。 指針聲明不會導致編譯時內存分配,並且需要使用calloc()或malloc()進行動態分配

當您執行以下賦值時,它實際上是整數數組到整數指針的隱式類型轉換。

pointer = array; 

暫無
暫無

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

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