[英]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中,數組名稱轉換為指向數組第一個元素的指針。 linearA
是float
的數組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.