1樓:
比較明顯的乙個作用,就是減少函式傳參,不然還需要傳乙個*index,來指示函式呼叫後的記憶體偏移量,傳**進去,函式呼叫後,你的指標就自動指向偏移後的位址了。
2樓:Belleve
指標的陣列,尤其是指向 struct 的指標的陣列,比如
typedef
struct
Record
;typedef
struct
RecordList
;指標的引用,比如拿來改指標變數值型別的二維陣列
3樓:
修改指標值,舉個例子,一般通過free釋放用malloc分配的記憶體時,會習慣性的將該指標「拴在」NULL,也就是:void FREE(void **pp)
}可變參列表二級指標,實現簡單的printf:void printf(char const *fmtchar **args = (char **)&fmt;
char str[5];
args++;
while(*fmt)
char *p;
fmt++;
switch(*fmt++) {
case 'd':
itoa(*((int *)args++), str, 10);
p = str;
goto outstr;
break;
case 's':
case 'c':
p = *args++;
outstr:
write_str(Red, p);
break;
default:
break
4樓:
用處太多,將來自己就明白了。
通常是因為,希望別人給自己的乙個指標賦值。
比如 COM 介面的指標是 void* 型別,獲取 COM 介面的函式的引數就是 void**。
當然了,這個東西,需要你有更多實踐,理解更加深入後,自然就逐漸理解了。
|addr
|value||
20|0A
|ch1←-
┐│|21
|CC|│
│|22|
20|p1--┘←
--┐│|
23|22|
pp1--------
┘現在我們假設有乙個變數
char
ch1=
0x0A
;// 假設 ch1 的位址位於 20H: m[20H] = 0AH;
char*p1
=&ch1;
char
**pp1=&
p1;假設記憶體空間,我們看做乙個陣列: char[ ]; 為這個陣列取個名字叫做 m,例如:
charm[
256];
現在我們得到那個 0x0A ,就可以通過
char
ch2=
**pp1
;因此,我們就可以理解成:
char
ch2=m[
m[pp1]
];//解二級指標引用。
這是二級指標;
同樣,char
ch3=*p1
;可以理解成:
char
ch3=m[
p1];
//解指標引用
OK,在彙編層面,就是這樣(在組合語言中,沒有 m,只會出現 [ ]) 。比如說:
MOV EAX, [ EDX + 8 ]
CALL EAX
你該 get 它了。
5樓:尹明明
最簡單的乙個例子,當你想動態分配記憶體給二位陣列(矩陣,表,等等)的時候,你就可以使用**了。比如想建立乙個n x m的int矩陣,行數n和列數m由使用者輸入,你就可以使用int**來儲存這個二維陣列,然後再動態分配記憶體給這個陣列。
6樓:
那些只是只想指標的指標罷了。指標也是乙個內建基本資料型別,可以有指標來指向指標。用法與普通指標一樣,只不過指標指向的變數同樣是乙個指標。
C語言指標與二級指標的問題?
已登出 列印不出來是因為這條語句將嘗試訪問非法 程式不該訪問 的記憶體。printf s pt 嘗試訪問超出劃定範圍的記憶體空間,被作業系統攔下 答主重現了一下,那麼從下圖可以看出,p和pt的位址是0x00affb6c,abc 的首位址是0x00de6b30 那麼解引用pt得到的是0x00de6b3...
在C語言中, a N 與 a N 有什麼區別?
知了 剛好有看過這裡,嘗試著回答一下。這其實和C語言運算子優先順序有關,弄懂這一點就會比較清楚,這裡涉及兩個運算子,下標引用和間接訪問 下標引用運算子優先順序高於間接引用,所以 a N 首先是乙個陣列,而陣列的元素是指標 加上小括號之後,即在 a N 中,要先進行 運算,所以a是乙個指標,指向乙個具...
C語言中學習整數型別的取值範圍有什麼用,有什麼意義啊?
黃達 程式設計中,對於你定義的任何乙個 量 你都必須要清楚它的範圍。比如月份是1 12,考慮閏月就是1 13,用了0就是0 12。如距離,1mm 60000mm,超過這個數我不處理。這樣你才能決定用什麼樣的儲存形式來儲存這個量。比如1mm 60000mm的距離,儲存在32位無符號整數裡是合適的,64...