C語言 指標詳解

2021-10-23 01:13:46 字數 2846 閱讀 4834

​ 看滴水逆向之後的學習總結。

​ 編譯環境:vc++6.0

​ 個人認為:指標這一塊要真正明白每個指標代表什麼,如何在記憶體定址,還是要看指標的反彙編,才能理解透徹。

​ 指標的更本就是對記憶體的引用,應為指標引用起來比較方便,但是,在此之前不許要明白,有些記憶體是不能引用的。

特別注意常量區。比如

char* p ="hello,world!\0"
此時的字串helloworld就儲存在常量區,通過指標p可以引用它,進行讀操作,但是不能進行寫操作,比如

*p = 'h;
這樣寫雖然能通過編譯,但是程式不能執行,因為常量區的資料補課寫入。

​ 包含char,short,int,double,這些變數型別的指標。

​ ***以char型舉例。

char* p;
​ 這裡的變數,並不是 * p,而是p,他的型別為char*(忘掉書上刻板的概念),也就是說,他在記憶體中和char型資料一樣的存放變數,只不過char*型資料儲存的是位址。

可以發現,char*的p和int的a位元組寬度都是4,只不過p的記憶體儲存的是乙個位址。

這樣就更明顯了,也就是說,

char* p;
這樣只是代表乙個資料型別為char*的變數p,p在記憶體中的寬度為4,用於存放位址,而通過*p,能尋找p儲存的位址對應的資料,並且根據char*,確定*p的大小為char型,即1個位元組。

通過上面的舉例,我要說的是,所有的指標變數其實都是4個位元組,因為他們用於存放位址。而通過*這個符號,可以引用對應位址的資料。

​ 所以,二維指標,* * p,我們可以將p指向乙個位址,這個位址儲存的是另乙個資料的位址,比如a的位址,那*p輸出的就是a的位址, * *p輸出的就是a的值。

​ 三維指標,四位指標……等等就是這樣反反覆覆尋找對應位址的資料。

​ 既然不管指標什麼型別,他的大小都是4個位元組,且儲存位址,那為啥還有劃分型別呢?

不像陣列的定址,只需要str[i]中的i一直自增即可,而指標的定址是根據資料偏移,而資料偏移的量,其實就跟這個指標的型別有關。比如

可以發下,char*型的p自增,位址+1;而int*型的q自增,位址+4;

所以當他指標定址是,根據變數型別不同,偏移的量也不同。

結構體指標,一般用於指向乙個結構體,方便查詢資料。

strct student

stu;

//這個結構體的寬度為12,不是9,因為 存在位元組對齊。

//結構體指標

結構體指標同樣以符合指標的定址,偏移規則,

一般結構體引用變數的方式為

stu.number = 10;
而結構體指標p引用這個結構體stu的變數,方式為

p->number = 10;
同結構體指標一樣,陣列指標一般指向乙個陣列的首位址。

舉例乙個char型的陣列指標。

char (*p)[n] ;//一定要寫(),不然性質就變了。
這裡的變數名一樣是p。而對於的資料型別是char (*)

除錯一下

char (*)p[4];
因為char的大小為1個位元組,所以p的大小為1*4=4。

如果是int

int (*)q[4];
因為int的大小為1,所以q的大小為4*4 = 4 。

而一維的陣列指標的定址,需要兩個*,即

printf("%d",*(*(p+1)+1));
因為這p的大小為4,,所以*(p+1)的偏移為1 * 4,(因為是char型)。

而後面總共的偏移為1 * 4+1 * 1 = 5 ; 就相當於a[5],對應就是字元f。

char *p[5];
指標陣列的本質是乙個陣列,只不過陣列的每個變數存放指標。

指標函式的本質是乙個函式,只不過函式的返回值為乙個指標。

c語言指標詳解

一.指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。1.指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部...

C語言指標詳解

類似於 int p char p 或者自定義型別的 person p struct p 這些都是基本的指標變數,不管什麼型別的指標變數都是乙個存位址的變數,所以它們的大小都是四個位元組 還有一種void p 型別,類似於 js 或者 c 的 var 可以傳入任何型別變數的位址,也可以轉換成任何型別變...

C語言指標詳解

c語言指標應用 一 指標是什麼 指標是乙個特殊的變數,它存的是記憶體裡的乙個位址。指標四要素 1.指標的型別 把指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別如下 1 int p 指標的型別是int 2 char p 指標的型別是char 3 int p 指標的型別是int 4...