對於記憶體而言,將記憶體單元的編號叫做位址,這個單元的位址即稱為指標。c語言中用乙個變數來存放指標,這種變數稱為指標變數。指標變數的值就是某記憶體單元的位址或指標。
變數的指標就是變數的位址,存放變數位址的變數就是指標變數。eg:i_pointer代表指標變數,而*i_pointer是i_pointer指向的變數。
型別說明符 *變數名;
//int *p;
乙個指標變數只能指向同型別的變數
//指標的定義
int a;
int*p=
&a;int
*q;q=
&a;//不用再加*;
//*q,*p都代表a的值,q、p都指向a的位址
指標變數在函式呼叫時,將實參變數的值傳遞給形參變數。採取的依然是「值傳遞」。
//考慮下列語句的錯誤
swap
(int
*p1,
int*p2)
temp作為乙個指標變數,它應該儲存指標變數,第一處和第二處錯誤都是因為,此時,temp還沒有儲存位址,所以取不到相應的值。
指標運算子 * 與指標說明符 * 不是一回事。在指標變數說明中,「 * 」是型別說明,表示其後的變數是指標型別。而表示式中的「 * 」則是表示指標變數所指的變數。
int a[5]
,*pa;
pa=a;
//可以將陣列的首位址賦予指標變數
pa++
;//指標指向的位置向後移動
char
*pc;
pc =
"c language"
;//將字串的字元陣列的首位址裝入指標變數
int(
*pf)()
;//函式入口指標
pf = f;
//f為函式名
兩個指標變數還能進行減法運算,表示相差的位址。但是加法是不允許的,因為毫無意義。
指標變數賦0值和未賦值是不同的,未賦值時不能使用。
int a[5]
,*p;
p=a;
//等價於p = &a[0]
此時可以*(p+i)或*(a+i)或a[i]來訪問第i個元素,p[i]與*(p+i)等價。
值得注意的是,p++是合法的,a++不是合法的,因為a是陣列的首位址,是乙個常量(static)。
陣列做引數
void
main()
f(int*x,
int n)
可以形參和實參都是陣列名;實參用陣列,形參用指標變數;實參、形參都用指標變數;實參為指標變數,形參為陣列名;
int a[3]
[4]=
,,};
//a既是二維陣列名,也代表整個二維陣列的首位址,也是二維陣列0行的首位址,a[i]代表第i行首位址
int(
*p)[4]
;//指向包含4個元素的一維陣列
p=a[1]
;
字串指標可以寫為
char *ps;
ps=「c language」;
而對陣列而言,不能寫為
char st[20];
st=;
型別說明符 *函式名(形參表)
//返回值是指標
char
*name=
;//name[0]指向illagal day
#include
"string.h"
intmain()
;int n=5;
sort
(name,n)
;print
(name,n)
;return0;
}void
sort
(char
*name,
int n)}}
void
print
(char
*name,
int n)
char **p;
p=name[1];
int
main
(int argc,
char
*ar**)
用於dos命令列輸入:c:>可執行檔名 引數 引數 …
argc 代表命令列引數個數(可執行檔名也是乙個引數)
所以取引數一般從ar**[1]開始
C語言學習周總結006(指標)
指標 pointer 可謂是c語言的一大精髓,同樣也是c語言學習的一大難點,早在正式開始學習c語言前就聽說過這一大名,如今我也開始接觸到了它。通過課上的學習以及課下的整理,我對指標有了一些了解。在認識指標前,我們先要認識記憶體位址這一概念。要知道,我們每定義乙個變數,系統就會在記憶體中為該變數分配一...
C語言學習(三) 指標
指標的定義int p char p float p指標變數所佔記憶體的大小 跟前面定義的型別無關 而跟系統有關 16bits作業系統 2b 32bits作業系統 4b 64bits作業系統 8b 指標指向乙個值所在的第乙個位元組 通常乙個位址存放乙個位元組 const修飾指標 指標指向乙個字串時 如...
C語言學習4 指標
int a 10 int p a 一級指標 int s p 二級指標 int p 10 指向陣列的指標 int s 10 指標指向放指標的陣列 這個陣列有十個空間 int p 10 開闢10個空間 每個空間放指標 例如 int br 10 int s 10 br int ar 10 int p 10...