指標理解(續)

2021-06-06 07:27:57 字數 2738 閱讀 9523

使用的測試程式:

#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 多維陣列與指標 ...