使用的測試程式:
#include
#include
int test_1(int * point)
int test_2(int ** point)
int test_3(int *** point)
int main(int arg, char **argv)
;printf("p_1:%08x \n", p_1);
printf("&p_1:%08x \n", &p_1);
//printf("*p_1:%08x \n", *p_1);
printf("p_2:%08x \n", p_2);
printf("&p_2:%08x \n", &p_2);
printf("p_3:%08x \n", p_3);
printf("&p_3:%08x \n", &p_3);
printf("s: %08x\n", s);
printf("&s: %08x\n", &s);
printf("*************************\n");
//printf("*p_1:%08x \n", *p_1);//here generate segmention fault, bacause the p_1 is null
//*p_2 = s;//here generate segmention fault, bacause the p_2 is null
s[1] = (int)(&p_1);
printf("s[1]:%08x\n", s[1]);
p_2 = s;
printf("start");
printf("*p_2:%08x \n", *p_2);
printf("**p_2:%08x \n", **p_2);
printf("*************************\n");
test_1(p_1);
test_2(&p_1);
test_3(&p_2);
printf("p_1:%08x\n", p_1);
printf("p_2: %08x\n", p_2);
printf("p_3: %08x\n", p_3);
while(1);}
第一次記錄:
p_1:00000000
&p_1:bfeee100
p_2:00000000
&p_2:bfeee0fc
p_3:00000000
&p_3:bfeee0f8
s: bfeee0f4
&s: bfeee0f4
*************************
s[1]:bfeee100
start*p_2:00000001
段錯誤
將 s[1] = (int)(&p_1);
修改為s[0] = (int)(&p_1);
第二次記錄:
p_1:00000000
&p_1:bf915ec0
p_2:00000000
&p_2:bf915ebc
p_3:00000000
&p_3:bf915eb8
s: bf915eb4
&s: bf915eb4
*************************
s[1]:00000000
start*p_2:bf915ec0
**p_2:00000000
*************************
point : 00000000
point : 08994008
2_point: bf915ec0
*point: 08994210
3_point:bf915ebc
*3_point:08994418
p_1:08994210
p_2: 08994418
p_3: 00000000
由兩次紅色部分可知,二級指標相對於一級指標是訪問了三次記憶體單元,
第一次訪問p_2自己的記憶體單元,得到(&p_2)記憶體單元中的內容ctx1;
第二次訪問內容ctx1指向的記憶體,帶到(ctx1)記憶體單元中的內容ctx2;
第三次訪問內容ctx2指向的記憶體,得到(ctx2)記憶體單元中的內容ctx3;
這個ctx3就是需要讀取的資料。
由紫色部分知道,陣列與指標變數是不一樣的,
陣列的名字表示的就是記憶體單元的位址,
指標變數的名字表示的是記憶體單元中的內容。
(為什麼指標中的內容是四個位元組也就是因為這個緣故,
因為記憶體位址在32位機上是四個位元組。
但是並不是指標的內容都是四個位元組,
這個要根據記憶體位址的位元組數來判斷。
不同機器可能有差異)
所以指標與陣列有很大的差異。
這個也可以解釋為什麼
char *p = "hello word"
中*p = 『h』是錯誤的,將造成段錯誤。
因為p中的內容是"hello word"的位址,
而這個位址是在rodata區,唯讀資料區
而*p也就表示rodata中的記憶體單元中的內容,
*p = 『h』將向唯讀區寫資料,是要出錯的。
如果想向*p中寫資料,
可以先修改p的值,(這個值要是能寫入的記憶體單元位址)
然後再向*p中寫入資料。
這個時候p已經不指向"hello word"的記憶體單元了。
C語言高階(牟海軍)C 語言指標理解 續
給個例子 include include include include int main srand time 0 int a int row,col printf please input a row n scanf d row printf please input a col n scanf...
C語言基礎之指標續
一 指標 1 指標與陣列 include int main int p 下面兩句其實是等價的,陣列名本身就代表陣列位址 p ages p ages 0 printf p p n p 指標指向陣列首元素,因此列印的是陣列位址 printf p d n p 指標指向陣列首位址,其指向位址中的值就是age...
指標 C之精華 續1
1 先取 p值,後使p值加1 p 與 p 等價。和 同優先順序,結合方向自右而左 2 先使p值加1,後取 p值 p 1 用陣列名做函式引數 c編譯時將形參陣列名 作為指標變數來處理的,所以以下2個函式的定義是等價的 f int arr int n f int arr,int n 2 多維陣列與指標 ...