心血來潮:重新溫習一下C語言的指針

近來幾天白天有時候比較有空,所以就複習看看資料,這兩天,有了重新溫習一下C語言的幹勁,於是就記錄下來一些點滴。
在計算機中,所有的數據都是存放在存儲器中的.一般把存儲器中的一個字節稱爲一個內存單元,不同的數據類型所佔用的內存單元數是不等的,如整型量佔2個單元,字符量佔1個單元.爲了正確地訪問這些內存單元,必須爲每個內存單元編上號即可準確地找到該內存單元,內存單元的編號也叫做地址。根據內存單元的編號中地址就可以找到所需的內存單元,所以也把這一個地址稱爲指針。
嚴格地說,一個指針是一個地址,是一個常量。而一個指針變量卻可以被賦予不同的指針的值,是變量。
變量的指針就是變量的地址。存放變量地址的變量是指針變量。

1、定義一個指針變量
[code]int *p1;
float *p2;[/code]
注意一點,一個指針變量只能指向同類型的變量。

2、指針變量的引用
指針變是的賦值只能賦予地址,決不能賦予任何其他的數據,否則將引起錯誤。如:
[code] int a ;
int *p = &a;

int a;
int *p;
p = &a;[/code]
3、指針變量作爲函數參數,舉例:
[code] swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
exchange(int *q1,int *q2,int *q3)
{
if(*q1<*q2) swap(q1,q2);
if(*q1<*q3) swap(q1,q3);
if(*q2<*q3) swap(q2,q3);
}[/code]
注意一點,在指針變量說明中,"*"是類型說明符,表示其後的變量是指針類型。而表達式出現的"*"則是一個運算符用以表示指針變量
所指的變量。
如:
[code] int a,*pa = &a,*pb;
pb = pa; /*把a的地址賦予指針變量pb*/[/code]

4、指針變量的一些細節內容
4.1、可以把數組的首地址賦予向數組的指針變量.如
int a[5],*pa;
pa = a; /*這一句也可以寫成 pa = &a[0]; */

4.2、也可以把字符串首地址賦予指向字符類型的指針變量。
例如:
[code] char *pc;
pc = "C Language";[/code]
當然也可以直接賦值啦:char *pc = "lighter.iteye.com";

4.3、把函數的入口賦予指向函數的指針變量,如:
[code] int (*pf)();
pf = function; /*function爲函數名稱*/[/code]

4.4 對於指向數組的指針變量,可以加上或減去一個整數n。設p是指向數組a的指針變量,則p+n,p-n,p++,++p,p--,--p的運算都是合法的。
如:
[code] int a[5],*pa;
pa = a;
pa = pa +2; /* pa 指向a[2],即pa的值爲&pa[2] */ [/code]


5、數組指針
看一個例子:
[code] int a[10];
int *p = a;[/code]
注意一下,p+i和a+i就是a[i]的地址,或者說它們指向a數組的第i個元素。
*(p+i)或*(a+i)就是p+i或a+i所指向的數組元素,即a[i]。

另外一點,指針變量可以實現本身的值的改變,如p++是合法的,而a++是錯誤的。因爲a是數組名,它是數組的首地址,是常量。
*p++,由於++和*同優先級,結合方面自右而左,等價於*(p++)

6、數組名作函數參數,可以用指針的方式來實現
[code] float aver(float *pa);
main(){
float sco[5],av,*sp;
int i;
sp = sco;
for(i =0;i<5;i++) scanf("%f",&sco[i]);
av = aver(sp);
printf("%5.2f",av);
}

float aver(float *pa){
int i;
float av,s=0;
for(i=0;i<5;i++) s = s+*pa++;
av = s/5;
return av;
}[/code]
再看一個例子,查看最大值與最小值的
[code] int max,min;
void max_min_value(int array[],int n){
int *p,*array_end;
array_end = array + n;
max = min = *array;
for(p=array +1;p<array_end;p++)
if(*p>max) max = *p;
else if(*p < min) min = *p;
return;
}[/code]

總結一個,如果有一個實參數組,想在函數中改變此數組的元素的值,實參與形參的對應關係有以下幾種:
I、形參和實參都是數組名
II、實參爲數組,形參爲指針變量
III、實參,形參都用指針變量
IV、實參爲指針變量,形參爲數組名

7、字符串指針變量
舉例,想要輸入字符中N個字符後所有字符。
[code] main(){
char * ps = "lighter.iteye.com";
int n = 10;
ps = ps + n;
printf("%s\n%",ps);
}[/code]
再寫一個例子,要求把一個字符串的內容複製到另一個字符串
[code] cpystr(char *pss,char *pds){
while(*pds++=*pss++);
}[/code]
注意一點,字符串指針變量本身是一個變量,用於存放字符串的首地址。而字符串本身是存放在該首地址爲首的一塊連續的內存空間並以
'\0'作爲串的結束。字符數組是由於若干數組元素組成的,它可用來存放整個字符串。

8、指針數組
舉例,定義一個指針數組:int *pa[3];

9、指向指針的指針
[code] main(){
char *name[] = {"lighter","javaeye","com","nice"};
char **p;
int i;
for(i=0;i<4;i++){
p = name + i;
printf("%s",*p);
}
}[/code]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章