-
這裡有兩個問題:
2。即便如此,pa((int**)a)。我傳入了輔助陣列的第乙個位址,但結果仍然不正確。
這是因為 void pa(int **p) 在執行 printf("%d",*(p+i)+j));i=1 你本來想讓 *(p+i) 指向陣列第二行的第乙個位址,但從定義 void pa(int **p) 來看,你不知道一行有多少個數字,不能指向陣列的第二行,按照一般加 1 運算直接將指標向前移動 1(4 個位元組)
所以這裡的關鍵是告訴編譯器 p+1 正在移動一行,而不是簡單地移動指標占用的空間; 所以它應該定義為 void pa(int p[2]),它表示如果一行是兩個整數 p+1,它將被移動。
因此,將函式宣告更改為:void pa(int p[2])。
-
void pa(int **p) 這裡的引數有問題,int **p 是指向指標的指標,改為如下:
void pa(int *p)
然後只需使用 printf("%d", p[i][j]),因為 pa(a) 傳遞位址。
-
是的,int **p,這是指標的指標。
A 只是乙個位址。
int (*p)[2];
-
二維陣列實際上是乙個連續空間。
void pa(int *p),1, 0}
pa((int*)a);
-
第二個維度是在傳遞固定長度的陣列指標時指定的。
int (*p)[2]
-
不。 首先,陣列名稱是指向陣列位址的指標常量。
假設 int a[3] 是乙個陣列,其中 a 是乙個通用指標,即乙個一維陣列指標,其位址型別為 int * 所以要定義指向該陣列的指標 p,其格式為:int *p; 然後你可以分配乙個值:p=a; (型別一致)。
假設乙個二維陣列,如 int b[3][4],其中 b 是指向行位址的常量指標,其位址型別為 int (*4)。 因此,要定義指向此陣列的指標 ptr,它應該採用以下格式:int (*ptr)[4]; 然後,您還可以分配乙個值:
ptr=b;(型別一致)。
這裡容易混淆的是,看起來一行資料是乙個一維陣列,所以很多人會把二維陣列中的一行資料與一維陣列的資料混淆線寬不同
我們可以看到,一維陣列的位址型別是(型別*),沒有下標(行寬、陣列長度、元素數),定義陣列時只需要給出下標,或者省略下標時必須初始化下標,編譯器會自動獲取下標並分配記憶體。 因此,指向一維陣列的指標沒有下標,這就是為什麼指標靈活且不安全的原因(陣列邊界檢查和寬度控制完全留給程式設計師)。 但是,二維陣列中的行寬是確定的和強制性的,因此二維陣列的線寬必須是顯式的,因此其指標定義必須包含線寬資訊。
type(*n]是線指標型別格式,方括號內的n表示線寬,所以線指標不是簡單的一維陣列指標,而是寬度有限的一維陣列指標,這就是區別。
總結一下。 一維陣列指標定義格式:鍵入 *p
二維陣列行指標定義格式:型別 (*p)[n]。
另外,一維陣列指標加一是遞增乙個型別的寬度,二維陣列行指標是增加型別寬度*行寬,即資料寬度乘以一行中的元素數,單位均為位元組。
-
int **p 是指向 int* 的指標,int(*p)[10] 是指向陣列的指標。
-
由於 int **p 定義是指向 int* 型別的指標,因此在樓下所說的 int **p。
int (*p)[10] 是乙個指向長度為 10 的陣列的指標
如果定義為 deal(int **p),則應使用引數來加強型別轉換:deal((int**)a);
而且用 p 的時候不能用下標,p[2][3] 就錯了,因為你不知道 p 指向的 int* 型別的長度,也編譯成 *(p+2*10+3)。
您必須編寫 *(p+2*10+3) 才能呼叫它。
如果它被定義為 deal(int (*p)[10]),則情況並非如此,並且編譯器將知道 p 是指向長度為 10 的陣列的指標。
然後 p[2][3] 將被編譯為 *(p+2*10+3)。
簡而言之,C 語言非常靈活,不同的定義和不同的用法可以得到正確的結果。
不知道房東懂不懂?
還有多維陣列與多維指標的問題,房東可以自己做個類比。
-
int*p;這是乙個指向指標的指標,這意味著指標變數 p 應該指向指標的位址,注意它必須是指標的位址,這樣就不會有錯誤,例如。
inta=1;
intp1=&a;
int*p=&p1;它不能是 int
p=&a;因為變數 a 不是指標,所以它也是如此。
二維陣列 a[2][3] 的陣列名稱。
這裡注意,這裡的陣列名不是簡單的指標,二維陣列的陣列名是指向一維陣列的指標,即陣列名稱a是指向包含三個元素的一維陣列的指標,即(*)3];因此,不應將陣列名稱分配給指標 **p,而應將二維陣列名稱分配給 int
p)[3],表示指向 3 個元素陣列的指標。
對於陣列名稱不是乙個簡單的問題,例如一維陣列名稱 a[3],則陣列名稱 a 表示指向第乙個元素的指標,而 &a 表示指向包含 3 個元素的一維陣列的指標。
讓我簡要地向你解釋一下。
p 是乙個陣列,每個陣列元素都是乙個指標,所以 *p[1] 表示指標 p[1] 指向的位址值,而 p[1] 表示指標 p[1] 指向的位址,所以 *p[1] 和 p[1] 不一樣。 現在我們來看陣列名稱 p,陣列名稱 p 表示 &p[0] 的位址,也就是指標 p[0] 的位址。
請記住,無論陣列中有多少維,陣列的名稱都表示 &a[0] 的位址。
-
指向一維陣列的指標只是指標的應用,這意味著定義了指向一維陣列的指標。
使用指標訪問陣列是指標的用途,這意味著您可以使用指標訪問陣列,例如 int*p=(int
a[0];*p+1)=a[1].
-
a[10],*p;
p=a;或者 p=&a[i]; 定義指向一維陣列的指標後,可以使用該指標訪問陣列元素。 換句話說,還有另一種方法可以訪問陣列元素。 例如,如果我們定義了指向一維陣列 a 的指標變數 p,我們可以使用 *p 來獲取它指向的陣列元素。
2. 指向一維陣列的指標無法訪問二維陣列中的元素及其位址。 二維陣列中還有其他指標形式,用於定義和訪問陣列元素。
-
指向一維陣列的指標:int
a[10],a
是指向一維陣列的指標。
指向陣列的指標變數:int
a[10]int*p=
a;p 指向陣列的指標變數。
相同:所有人都可以訪問陣列的元素,例如。
A[i] 和 P[i],(P+I)。
等價。 區別一:
a 是乙個指標常量,其值不能更改。
例如,INTA [10];
intb[10];
a=b;試圖改變乙個持續的、非法操作的價值!
p 是更改其值的指標變數。
例如,INTA [10];
int*p=a;
intb[10];*p=
b;試圖更改變數的值,合法操作!
區別2:INTA[10];
int*p=a;
printf("%d
d",sizeof(a),sizeof(p));
輸出 40,4 大小為
在計算指標的大小時,如果它是指標常量,則結果是指標常量指向的區域的大小。 比如按 10
int 元素,占用 4
位元組。 如果它是指標變數,則結果是指標變數本身的大小。 指標變數通常占用 4 個位元組。
二維陣列實際上是陣列的陣列,因此指向二維陣列的指標是指向陣列的指標。 考慮到這一點,選擇返回型別很簡單。 >>>More
如果 P2Psearcher 無法連線伺服器或無法搜尋,則很可能是電腦上已經啟動了 Thunderbolt 或 eMule 軟體,只是占用了 P2pSearcher 的埠,因此無法連線到網際網絡。 >>>More
你好。 小公尺手機出廠就是系統的穩定版,穩定版不支援root,有些軟體需要root許可權,小公尺手機自帶安全和系統管理軟體,不建議你安裝第三方安全軟體,安裝這些軟體可能會影響手機的正常使用。如果您需要root訪問許可權,建議您將資料備份並flash備份到支援root的開發版本。 >>>More