定義指標變數,在變數名前面加星號*
,格式為:
int a;
datatype *pointname; int *p; p = &a;
或者 int a;
datatype *pointname = value; int *p = &a;
定義指標變數時必須帶*
,給指標變數賦位址值時不能帶*,等於乙個位址即可改變指標指向
。
1//定義普通變數
2float a = 99.5, b = 10.6;3
char c = '
@', d = '#'
;4//定義指標變數
5float *p1 = &a;
6char *p2 = &c;7//
修改指標變數的值
8 p1 = &b;
9 p2 = &d;
p1從指向&a變為指向&b,p2從指向&c變為指向&d。
這裡的*
稱為指標運算子,用來取得某個位址上的資料,
1 #include 2intmain()
執行結果:15, 15
a的位址是0x···,p 指向 a 後,p 本身的值會變為 a的位址值0x···,*p 表示獲取位址 0x··· 上的資料,也即變數 a 的值,所以 *p 變為了取資料值。
指標除了可以獲取記憶體上的資料,也可以修改記憶體上的資料
1 #include 2intmain()
執行結果:99, 99, 99, 99
*
在不同的場景下有不同的作用:定義指標變數時的*
和使用指標變數時的*
意義完全不同。
*
可以用在指標變數的定義中,表明這是乙個指標變數,以和普通變數區分開;
使用指標變數時在前面加*
表示獲取指標指向的資料,或者說表示的是指標指向的資料本身。
1int a,b; //
宣告變數
2int *p = &a; 或者 int *p; p = &a; //
定義指標
3 *p = 100; //
指標賦值&a的值
4 p = &b; //
改變指向
5 *p = 101; //
指標賦值&b的值
1int x, y, *px = &x, *py = &y;
2 y = *px + 5; //
表示把x的內容加5並賦給y,*px+5相當於(*px)+5
3 y = ++*px; //
px的內容加上1之後賦給y,++*px相當於++(*px)
4 y = *px++; //
相當於y=(*px)++
5 py = px; //
把乙個指標的值賦給另乙個指標
1 #include 2intmain()
執行結果:
a=100, b=999
a=999, b=100
假設有乙個 int 型別的變數 a,pa 是指向它的指標,那麼*&a
和&*pa
分別是什麼意思呢?
*&a
可以理解為*(&a)
,&a
表示取變數 a 的位址(等價於 pa),*(&a)
表示取這個位址上的資料(等價於 *pa),繞來繞去,又回到了原點,*&a
仍然等價於 a。
&*pa
可以理解為&(*pa)
,*pa
表示取得 pa 指向的資料(等價於 a),&(*pa)
表示資料的位址(等價於 &a),所以&*pa
等價於 pa。
在我們目前所學到的語法中,星號*
主要有三種用途:
摘自
C語言 初識指標
指標變數 格式一 型別名 指標變數名1,指標變數名2.int p char ch int a char c 指標的作用都一樣的,都是用來存放位址的,為什麼還要分型別的原因是指標變數p只能存放整型變數位址,指標變數ch只能存放字元變數位址。如何讓乙個指標存放乙個變數位址呢?p a ch c 叫做取址符...
初識C語言 指標
記憶體是電腦上特別重要的東西,計算機中所有的程式的執行都是在記憶體中進行的。所以為了有效的使用記憶體,就把記憶體劃分為乙個個小的記憶體單元,每個記憶體單元的大小是1位元組。為了能夠有效訪問到記憶體的每個單元,就給記憶體單元進行了編號。這些編號被稱為該記憶體單元的位址。位址即編號。那麼取出來的位址怎麼...
c語言printf和指標初識
1.printf是行緩衝 滿一行才輸出 遇到 n 或者 r 會輸出 scanf 和printf 用的同一緩衝區,當 printf 與scanf 連用時會輸出。因此在寫 printf 時要加 n 2.當執行程式發現段錯誤時,可以在每一行 下面加除錯資訊 printf s d n func line 這...