- 寫在前面
我們先舉乙個最簡單的例子
int i = 1;
我們知道它的意思, 定義了乙個整型變數 i ,它的值是1.
但是在編譯器或者computer的眼裡它是怎麼樣的呢?
編譯器先為變數i申請乙個位址,這個位址所存放的值是1.
也就是說如果要列印變數i的值是通過訪問位址的值來讀取變數i的值。
printf
("%p\n"
,&i)
;
printf
("%d"
,*ptd)
;
根本上來講,指標就是位址。
型別名 *p來表示
ps:下面的例子幫你更好地理解。
char s[5]
="love"
;char
*p;p = s;
這是字串s的存放值**,
乙個位址代表乙個位元組,乙個char型別字元所佔空間為乙個位元組。
字串型別最後一位c語言預設加乙個\0來結束
位址存放的值
10000
l10001
o10002
v10003
e10004
\0對於字串型別,指標解引用可以直接取得整個字串的值。(原理是指標指向字串首元素位址,c語言缺省會通過首位址依次往後遍歷直到』\0』結束)
**示意:
#include
intmain()
列印結果如下
這裡先帶你回顧乙個概念:
陣列名是陣列元素的首位址。
也就是說s與 &s[0]等價
具體後面討論陣列指標和指標陣列會用**詳解。
看到這裡你可能會有疑惑這裡為什麼不需要解引用。
就像上面寫的那樣,上述情況下,ptd實際上指向的是&s[0](s首元素的位址),c語言預設列印出字串格式的話會自動遍歷所有位址,可以理解為這種情況下ptd 和 s等價。
為了加深理解,你可以嘗試先將ptd改為*ptd. 再將 s改為 &s[0]、&s[1]試試看列印結果。
#include
intmain()
這樣的**是很危險的,因為我們不知道指標變數 i 到底指向**。這個道理就跟訪問未初始化的變數一樣,它的值是隨機的。
一般系統會直接報錯,但是當指標變數存放乙個合法的位址,那麼系統就排查不到。
具體原因可以思考左值,後面博文會寫到。
1.兩個值的交換 使用指標法
不用指標的方法 (如果你會自己寫函式的話不妨試試將交換的過程寫在乙個叫swap函式中,這裡先引入一下,後面傳值傳址會再講)
#include
intmain()
指標法
#include
intmain()
相信到這裡,指標概念用法你已經掌握 指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...