[英]doubts about C pointers
我試圖理解C中的基本概念。我有兩個問題:
1.為什么下面的代碼會起作用而另一個代碼不起作用?
/* This works fine */
typedef int SortTableRows[20];
SortTableRows* SortTableRowsPtr;
/* This will give error --> subscripted value is neither array nor pointer*/
int SortTableRows[20];
SortTableRows* SortTableRowsPtr;
第二個問題是第三行代碼是做什么的?
typedef int SortTableRows[20]; SortTableRows* SortTableRowsPtr; SortTableRowsPtr[2][3]=2; //Why the compiler doesnt give any error?how can we use a pointer as a 2d array.
你已經使用int SortTableRows[20]
將SortTableRows
定義為ints
的數組。 該標識符現在固定為數組,不能用於其他任何內容。 然后你嘗試將它用作聲明指針的類型(我認為)。 如果你想聲明一個指向int數組的指針,你會這樣做:
int *SortTableRowsPtr;
SortTablesRowPtr = SortTablesRows;
在第二個問題中,您將一個值賦給一個指向您正在將其視為二維數組的指針,這對您的編譯器沒有任何實際影響(盡管在此上下文中沒有任何意義),因為'多維'數組以線性方式存儲在內存中,與單維數組相同。 你的typedef
在這里沒有任何意義,因為你正在定義一種類型的數組,然后創建一個未初始化的指針(這會創建一個int **
),然后訪問它就像它指向有效的東西一樣(這將是編譯,但肯定會崩潰)。
要完成這項工作,您需要定義一個包含20個整數的數組,然后指向它:
SortTablesRows table[10] = {}; // equivalent to int table[10][20];
SortTablesRowPtr = table;
這是有效的,因為你聲明了一個指向20個整數數組的指針,即
int (*SortTablesRowPtr)[20];
我已經擴展了這個答案。 它有助於逐步解釋它。 拿一張3行10列的表格。 那是定義的:
int table[3][10];
然后,您可以設置指向此表的指針。 因為它是二維的,所以這是不對的:
int *ptr = table; // wrong - incompatible pointer
但這將指向第二行(和第一列):
int *ptr = table[1];
換句話說,你想要一個指向10個int數組的指針,即你想要一個指向int n[10]
類型的指針。 要做到這一點,你可以寫:
int (*ptr2)[10] = table;
現在您可以使用ptr2
直接訪問表,無論是指針,數組還是兩者。 現在它指向第一行和第一列。 如果你向ptr2
添加一個,它將選擇下一行。
ptr2[1][3] = 3; // change row 2, column 4
(*(ptr2 + 1))[4] = 10 // row 2, column 5 (yuck)
問題1。
在第一個中,你告訴它SortTablesRow是一個20個整數的數組。 所以SortTablesRow是一種類型。 在第二個中,您將創建一個名為SortTablesRow的變量,該變量是一個20個整數的數組。 這不能用作類型,因為它是一個變量。
問題2。
在這里,你輸入的SortTablesRow是20個整數的數組。 然后你說SortTablesRowPtr是指向它的指針。 所以現在你有一個指向20個int數組的指針。 這基本上是一個int **。 因此,第一個數組索引索引第一個指針,第二個數組索引索引第二個指針(或數組),從而查找20個元素的int數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.