相信對於學習過c語言的人來說指標一直是乙個難點。其實c語言也就只有這麼乙個難點,攻破了這個難點,要做的就是不斷實踐了,畢竟想好學好一門語言不實踐是不行的。
以上就是我們平時經常用到的一些型別,當然還包括char``double
等,這裡只是用int
型進行說明。
指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。
從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。
(1)int *p;//指標的型別是int*
(2)char *p;//指標的型別是char *
(3)int **p;//指標的型別是int **
(4)int (*p);//指標的型別是int(*)
(5)int *(*p);//指標的型別是int*(*)
「指標的型別」和」指標所指向的型別」是兩個概念,區分它們是學好指標的關鍵之一。
當你通過指標來訪問指標過指向的記憶體區時,指標所指向的型別據頂了編譯器把那片記憶體區里的內容當做什麼來看待。
從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*
去掉,剩下的就是指標所指向的型別。例如:
(1)int *p;//指標所指向的型別是int
(2)char *p;//指標所指向的型別是char
(3)int **p;//指標所指向的型別是int *
(4)int (*p);//指標所指向的型別是int()
(5)int *(*p);//指標所指向的型別是int*()
指標的值是指標本身儲存的數值,這個數值將被編譯器當做乙個位址,而不是乙個一般的數值。 指標多指向的記憶體區就是從指標的值所代表的那個記憶體開始,長度為sizeof(指標所指向的型別)的一片記憶體區。我們說乙個指標的值是xx,就相當於說該指標指向了以xx為首位址的一片記憶體區;說乙個指標指向了某塊記憶體取域,就相當於說該指標的值是這塊記憶體區域的首位址。
指標本身佔據了多大記憶體,用sizeof(指標的型別)測一下就知道了。
指標可以加上或減去乙個整數。指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的,以單元為單位。例如:
char a[20];
int *p=(int *)a;
p++;
指標p的型別是int *
,它指向的型別是int,它被初始化為指向整型變數a。由於位址是用位元組做單位,且一般32位程式中int為4個位元組,所以p++後,p所指向的位址由原來的變數a的位址向高位址方向增加了4個位元組。即原來p是指向陣列a 的第0號單元開始的四個位元組,此時指向了陣列a 中從第4號單元開始的四個位元組。
再來乙個例子:
char c[20]="you_are_a_good_boy";
int *p=(int *)a;
p+=5;
在上面例子中,p加上了5,編譯器是這樣處理的:將指標p的值加上5乘上sizeof(int),在32位程式中就是加上了5乘4=20。所以就是p所指向的位址由原來的位址向高位址方向移動了20位元組。
兩個指標不能進行加法運算,但是可以進行減法運算,但必須型別相同,一般用在陣列方面。
&
是取位址運算子,*
是間接運算子
&a
的運算結果是乙個指標,指標指標所指向的位址就是a的位址。
*p
的運算結果是p所指向的東西。這個東西得型別是p指向的型別,它所占用的位址是p所指向的位址。
乙個表示式的結果如果是乙個指標,那麼這個表示式就叫指標表示式。例:
pa=&a; //&a 是乙個指標表示式。
int **p=&pa; //&pa 是乙個指標表示式。
*p=&b; //*p 和&b 都是指標表示式。
由於指標表示式的結果是乙個指標,所以指標表示式也具有指標的四個要素:*指標的型別、指標所指向的型別、指標指向的記憶體區、指標自身佔據的記憶體*。
陣列的陣列名其實也可以看作乙個指標。
int a[2]=,b;
b=a[0]; //也可寫成:b=*a;
b=a[1]; //也可寫成: b=*(a+1);
可以宣告乙個指向結構型別物件的指標。*例:*
struct cl
;struct cl cn=;
// 宣告結構物件cn並初始化
struct cl *p=&cn;
//宣告乙個指向結構物件b的指標,它的型別是cl *,它指向的型別是cl
int *ps=(int *)&cn;
//宣告乙個指向結構物件cn的指標,它被指向的型別p是不同的。
可以把乙個指標宣告成為乙個指向函式的指標。*例:*
int fun(char *);
inta;
char
str="abcdefghijklmn";
a=fun(str);
int fun(char *s)
return num;
}
這個例子中的函式fun統計乙個字串中各個字元的ascii碼值之
和。 前面說了, 陣列的名字也是乙個指標。 在函式呼叫中, 當把 str
作為實參傳遞給形參 s 後, 實際是把 str 的值傳遞給了 s, s 所指向的
位址就和 str 所指向的位址一致,但是 str 和 s 各自占用各自的儲存空
間。 在函式體內對 s 進行自加 1 運算, 並不意味著同時對 str 進行了自
加 1 運算。
指標型別轉換和資料型別的轉換是一樣的,在變數前進行強制轉換。
很多時候我們買的**在語法上沒有錯誤,但是在邏輯上或者其他的地方有錯。在使用指標的時候,程式設計師常犯的錯誤就是自己寫了乙個指標,最後卻不知道這個指標指向了**。所以在使用指標的時候,程式設計師必須要清楚自己寫的指標指向了**,在用指標訪問陣列的時候,也要注意不要超出了陣列的低端和高階界限,以免出現錯誤。
本文是筆者看一些資料所總結,如有不妥,還請多多指出。
C語言指標
指標變數是包含記憶體位址的變數,它指向記憶體中的一塊區域,通過指標的值,可以間接訪問到相應的記憶體單元的資料,並做相應的修改。1 指標的定義和簡單使用 定義乙個指標變數和定義一般的變數類似,只需在變數名前面加乙個 對乙個指標變數賦值可以用取位址符 來獲取到乙個變數的位址,如果要獲得指標指向的記憶體區...
C語言指標
1 定義指標變數void change int n 格式 變數型別 變數名 定義了乙個指標變數p 指標變數只能儲存位址 指標變數p前面的int 指標變數p只能指向int型別的資料 int main void change int n 2 指標與陣列 陣列名其實質是乙個指標,但是它和普通的指標變數還是...
c語言指標
編寫程式,在主函式裡用指標陣列輸入六個字串,再用另乙個函式對這六個字串排序,並在主函式中輸出排好序的字串。include void sort char s,int n char temp for int i 0 ifor int j 0 jif strcmp s j s j 1 0 temp s j...