指標從狹義上來說就是位址,是個編號。
指標產生的意義:只是多了一種引用資料的方式。
這裡就要說到資料的引用方式:直接引用和間接引用
a.直接引用:也叫做按名訪問,通過變數空間的名稱來引用變數儲存的值.
int a=3;a=5;
int a=3;//定義乙個整形變數並且賦值為3指標變數是儲存指標的空間。int *p;//定義乙個同型別(整形)的指標變數p
p=&a;//讓指標變數p指向變數a的首位址(&a)
*p=5;//將5賦值給指標變數p所指向的空間;
和變數一樣,指標也需要在電腦中申請一段空間來儲存,而儲存指標的東西就是指標變數。
a.指標變數和指標的區別
e.g:
int a=3;其中:p為指標變數,&a為指標(也就是位址)int *p;
p=&a;
注意:星號「 * 」是一種定義標誌,表示p不是一般的變數(即p是特殊的變數名),不能夠儲存資料型別的常量,只能夠儲存位址。
b.指標變數的定義
格式:資料型別 *指標變數名
int *p;注釋:double *q;
char *k;
以int *p為例,在剩餘記憶體中申請乙個空間且命名為p,能夠儲存乙個整形單元/整形空間的首位址,占用四個位元組。
需要注意的是,因為在32位系統中佔32位,即4b(四個位元組),所以不論是int型,double型還是char型,在系統不變的情況下,都只占用四個位元組。
還需要注意的是,其中的資料型別是指標變數所指向單元的資料型別,表示著指標變數儲存空間的能力,而不是表示指標變數的資料型別。
c.指標變數的兩個運算子
int a=5;int *p=&a;
//定義乙個指標變數p指向變數a的首位址
//以下是錯誤示範:
&5;&(5+1);
//以下是正確示範:
&p;&(p+1);
int *p;//一級指標e.g:舉幾個例子來熟悉指標的使用int **q;//二級指標
int ***k;//**指標
指標指向
int a=3,b=5;//定義兩個變數並賦值指向值的交換int *p,*q;//定義兩個與變數型別相同的指標變數
//確定指標變數和一般變數的指向關係
p=&a;//p指向a空間的首位址
q=&b;//q指向b空間的首位址
//用一般形式直接輸出a,b的值
printf("%d %d\n",a,b);
// 用指標形式間接輸出a,b的值
printf("%d %d\n",*p,*q);
//用兩種形式輸出a,b在記憶體中的位址
printf("%d %d\n",&a,&b);
printf("%d %d\n",&*p,&*q);
int a=3,b=5;//定義兩個變數並賦值指向關係的交換int *p,*q;//定義兩個與變數型別相同的指標變數
//確定指標變數和一般變數的指向關係
p=&a;//p指向a空間的首位址
q=&b;//q指向b空間的首位址
int t;//新定義乙個變數t
t=*p;//將指標變數p所指向的空間中的值賦值給t(3->t)
*p=*q;//將指標變數q所指向的空間中的值賦值給指標變數p所指向 的空間(5->a)
*q=t; //將t中的值賦值給指標變數q所指向的空間(3->b)
printf("%d %d",a,b);//輸出結果:a=5,b=3
int a=3,b=5;d.指標注意事項int *p,*q;
p=&a;
q=&b;
//用一般形式直接輸出a,b的值
printf("%d %d\n",a,b);
// 用指標形式間接輸出a,b的值
printf("%d %d\n",*p,*q);
//用兩種形式輸出a,b在記憶體中的位址
printf("%d %d\n",&a,&b);
printf("%d %d\n",&*p,&*q);
//重點來了//
//我在前後用了相同的輸出格式,注意看指向關係改變前後結果有什麼不同//
int *k;//定義乙個新的指標變數k
//交換p和q的指向關係 //
k=p;//讓指標變數k儲存指標變數p所指向的空間的首位址
p=q;//讓指標變數p儲存指標變數q所指向的空間的首位址
q=k;//讓指標變數q儲存指標變數k所指向的空間的首位址
//用一般形式直接輸出a,b的值
printf("%d %d\n",a,b);//a,b的值未改變
// 用指標形式間接輸出a,b的值
printf("%d %d\n",*p,*q);//p和 q的指向關係交換,指向的位址與之前不同,導致結果與之前不同
//用兩種形式輸出a,b在記憶體中的位址
printf("%d %d\n",&a,&b);//可以看出a,b的位址沒發生改變
printf("%d %d\n",&*p,&*q);//可以看出p,q指向的位址發生改變
(1).指標變數必須先指向後使用
int *p;*p=30;
//上述指標變數p為「野指標變數」,指向空間不明確
//應將野指標變數變為可控制的指標變數,現做如下操作:(2).指標變數的基型別必須相同int *p;
p=null;
double a=3.14;(3).指標變數賦值的三種方法int *p;
p=&a;
//上述方法會導致 *p取出的值未知。因為 *p和a的基型別不同,double型的a占用記憶體8個位元組,而指標變數p只能引用占用記憶體4個位元組的int型別的一般變數。
1.通過&賦值
int a=3,*p,*q;2.指標變數之間相互賦值p=&a;
int a=3,*p,*q;3.通過動態記憶體空間申請函式賦值p=&a;
q=p;
兩個函式:malloc與calloc
C語言基礎 C語言指標 7 指向函式的指標
前幾節,我們講了指標對於陣列,字串,還有一些補充的知識,現在我們來講指標的最後乙個應用,那就是函式指標.下面我們來看乙個小例子 include char test int main char test 這個例子的函式,其實是返回char型別的函式指標,然後在main函式裡接收並且列印,也就是相當於 ...
學習C語言指標
先看個程式,是華為2005年招聘筆試題之一 include main int p,q p a q a 2 printf a p q d n q d n p d n q p d n a q p q,p,q p getch 執行結果 a q p 3 q 42 p 46 q p 2 6.3 指標的運算 指...
c語言 指標學習
最近重翻了c語言程式設計這本書,有了一些新的感觸,這本書從資料型別 運算子和表示式 迴圈和選擇結構 輸入輸出 陣列 指標 字串 函式 構造體和檔案操作等方面來深入淺出的介紹c語言。當然最令人印象深刻的是指標。指標是存放著變數的位址的變數的資料型別,換言之,指標變數儲存的是變數的位址值,由於指標可以直...