簡體   English   中英

對C指針的懷疑

[英]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;
  1. 第二個問題是第三行代碼是做什么的?

     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.

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