什麼是指標?
指標也是一種變數,存放的是某塊記憶體的位址。
我們知道,記憶體可以理解為是按位元組被分割成若干塊的,每一位元組都對應著乙個編號,並且這些編號從小到大依次排列,這個編號就是它的位址,獨一無二,而指標變數中的值就是這些編號
例如如下**的結果
#include #include int main()
這就是乙個指標變數的內容,乙個16進製制數,代表著記憶體中某乙個位元組的位址
指標解引用和取位址
int *p = &a 這行**的意思是將變數a的位址賦給了整形指標變數p,
此時p中存放的是a的位址,而*p就是對指標進行解引用,*p指向p中所存放的位址中的值,即a本身。
對*p進行+1操作,相當於a+1。
&a意思是取a的位址,相當於p
這一塊的理解沒有難度,但對初學者來說也需要一定時間。
指標的型別
指標的型別很豐富,資料有多少種型別,指標就有多少種型別與之相對,除此之外還有陣列指標、函式指標、以及指向指標的指標,即二級指標。
一般來講,一種型別的指標中所儲存的是與之型別相對應的變數的位址。
同時,指標也可以進行強制型別轉換操作
int a = 0;
char *p = null;
(int *)p = &a;
這裡也可以看到,指標的初始化操作是賦值為null,表示空指標,指向0位址。
另外,有一種特殊的指標void*,表示不確定型別的指標,可以接受任意型別的指標,常用作函式的引數。
指標的大小
記住!所有指標的大小都一樣,與型別無關,只與系統有關,在32位系統下,指標的大小為4個位元組,64位系統下,是8位元組。
指標的運算
指標作為一種變數是可以進行運算的,
指標加減整數後得到的結果是原位址加上或減去該型別大小的位元組數
#include #include int main()
上面**的結果為
如果你對型別的位元組大小記得很熟的話,相信你一眼就可以看出指標的乙個規律即
指標的型別決定了指標的操作許可權(多少位元組的範圍)
此時你是否有乙個疑問,乙個int型變數佔4個位元組,而指標只指向乙個位元組,那賦值後指標指向的是4個位元組中的哪乙個呢,答案是4個位元組中位址數最低的那乙個
也可以稱這個最低的位址值是就是int型變數a的位址值。
指標除了加減整數,也可以加減指標,得到的值表示兩個變數在記憶體中存放位置的差值。
二級指標
這時我們應該已經可以得出乙個結論,只要是我們所定義的變數,都被儲存在記憶體中,都有乙個位址,並可以把它賦給乙個指標變數。
那麼指標變數也不列外,它也有位址,也同樣可以被放在乙個指標變數中,而這個指標變數就是我們習慣稱之為的「二級指標」。
int main()
在上面的**中,二級指標p指向的是用於存放a的位址的指標pa,存放的是pa的位址。
**p等價於*pa等價於a。
指標與陣列
這是可以說是在c語言學習中,最難啃的一塊骨頭,我將另開一篇部落格陳述。
C語言指標的理解
include intmain int p1 2 p2 2 p3,p4,p5 宣告2個陣列指標,和3個普通指標 p1 arr 記住p1是陣列指標,是指向陣列的 printf d n p1 0 輸出陣列裡的第乙個元素 p1 指標自增,自增按陣列單位自增,這裡看成一維陣列的話,乙個陣列單位就是3,相當於...
C語言 指標的理解
要理解c語言 中指標的意思,最好的方法就是畫表。先從最簡單的 開始,用畫表來分析。例1 include studio.h intmain void 可以這樣畫表 因為0x1000位址裡存放的變數a是int型別,所以指向變數a的指標型別是int 同理,如果變數a的型別是unsigned char,則指...
C語言 指標理解
剛剛程式設計遇到了乙個問題,如下 include struct nodetree 101 int loc node creat bool build node t,char c return true intmain return0 預期結果,我本來想達到一種效果,就是將t傳進去,然後對t做修改,返...