簡體   English   中英

關於C中的指針

[英]About pointers in C

我開始閱讀一些關於C中指針的文章,我有一個我不明白的例子。

示例來自: http//en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays

這里是:

讓我們看一個稍微不同的問題。 我們想要一個二維數組,但我們不需要讓所有行都具有相同的長度。 我們所做的是聲明一個指針數組。 下面的第二行將A聲明為指針數組。 每個指針指向一個浮點數。 這是一些適用的代碼:

float  linearA[30];
 float *A[6];

 A[0] = linearA;              /*  5 - 0 = 5 elements in row  */
 A[1] = linearA + 5;          /* 11 - 5 = 6 elements in row  */
 A[2] = linearA + 11;         /* 15 - 11 = 4 elements in row */
 A[3] = linearA + 15;         /* 21 - 15 = 6 elements        */
 A[4] = linearA + 21;         /* 25 - 21 = 4 elements        */
 A[5] = linearA + 25;         /* 30 - 25 = 5 elements        */

 A[3][2] = 3.66;          /* assigns 3.66 to linearA[17];     */
 A[3][-3] = 1.44;         /* refers to linearA[12];           
                             negative indices are sometimes useful.
                             But avoid using them as much as possible. */

我的問題是為什么A[0]只是指向五個元素的指針,而不是指向所有的linearA ,因為數組的名稱是指向其第一個成員的指針。

並且A[1] = linearA + 5; 是連續6個元素 - 出於同樣的原因? 不是A[1]應該是指向linearA的第6個成員的linearA嗎?

有人能解釋我的錯誤在哪里嗎?

除少數例外情況外,在C中,數組名稱轉換為指向數組第一個元素的指針。 linearAfloat的數組30,在表達式中:

A[0] = linearA;

它被轉換為指向float的指針。

A是指向float的指針的數組6。 A的元素是float的類型指針。 因此A[0]是指向float的指針而不是指向數組的指針。

並且C中的A[i][j]等價於*(A[i] + j)因此A[i][j]是一個float (取消引用指向float的指針會產生一個float )。

A[0]是指向linearA的第一個元素的linearA 由於linearA是一個連續的數組,因此該指針實際上允許通過添加適當的偏移量來訪問任何linearA 30元素。 但是,在這段代碼中,您可以通過指向linearA數組中的不同偏移來模擬2D數組。 結果是類似2D的數組尋址: A[n]將您帶到第n行的位置(即linearA A[n][m]中的偏移量), A[n][m]將您帶到此行內的第m個元素。

這是因為這一行設置了一個包含6個float的數組:

float *A[6];

這一行設置了第一個指向30的第一個元素的指針。

A[0] = linearA; 

因此,A的每個元素都指向原始數組的子部分。 你必須分配它們 - 它們最初會指向隨機地址。

第一個是初始地址( &linearA[0] ),接下來的五個是以下的地址。 這些可以作為A[0][0]A[0][5] 由於數組對應指針的方式,只要你不超過30,你就可以繼續上升。

但是你可以將A[n]分配給你喜歡的數組的任何部分。 只要它是原始數組的一部分,它就會指向該成員,以及接下來的5個(或者你想要的多少)。

例如,通過將A[1]指向&linearA[6] ,您將有效地設置一個二維數組(它將類似於一個,但不會表現為一個)。

我的問題是為什么A [0]只是指向五個元素的指針,而不是指向所有的linearA,因為數組的名稱是指向其第一個成員的指針。

你設置A[0]指向linearA ,它是數組中的第一個浮點數, A[0]是指針,因此不知道它指向地址的部分。 因此A[0]不是指向數組開始的五個元素的指針,並且沒有數組結束位置的概念。

並且A [1] = linearA + 5; 是連續6個元素 - 出於同樣的原因? 不是A [1]應該是指向linearA的第6個成員的指針嗎?

A[1]指向第六個元素,但正如它在起始地址之前所說的那樣。

您發布的示例顯示了一種稱為Iliffe向量的稍微深奧的技術,這是在C中實現鋸齒狀數組的一種可能方式。鋸齒狀數組是每行具有不同長度的矩陣。

由於數組在C中是一維的,因此您創建一個包含所有元素的單個數組linearA ,它被解釋為一系列行,每行都有不同的大小。 指針數組A包含指向每行第一個元素的指針,允許您使用行和列索引訪問元素。

代碼顯示了C指針和數組的幾個有趣特性:

linearA + 5

指針算術:向指針(或數組)添加一個整數,為您提供指向原始指針后n個元素的指針。

A[3][2] = 3.66;

這個漂亮的語法允許您將此結構視為二維矩陣。

此外,這可能是示例的要點, 指針和數組是可以互換的 這里, A[3]是指向float的指針,因為A被定義為指向浮點數的指針數組; appending [2]為我們提供了原始指針指向的元素之后的2個元素。 這與上面的指針算法類似,只是在這種情況下指針被解除引用。 實際上,數組訪問是根據指針定義的,所以X[5]相當於*(X+5)

A[3][-3]

這表明沒有什么能阻止您訪問給定行之外的元素。 在這種情況下,您將訪問A[3]指向的元素之前的3個元素。 這是很少需要的東西,它只適用於這種情況,因為你構建了矩陣以具有連續的元素。 通常,訪問分配的數組范圍之外的元素會使程序崩潰。

最后,回答你的問題:

並且A[1] = linearA + 5; 是連續6個元素 - 出於同樣的原因? 不是A[1]應該是指向linearA的第6個成員的linearA嗎?

作為指針和數組是可互換的, A[1]兩個指針在第六元件linearA 從在第六元素開始的陣列linearA 語言中沒有任何內容表示后者長度為6個元素,您必須在代碼中實現該邏輯。

暫無
暫無

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

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