C語言 指標學習(個人向)

2021-10-18 21:50:51 字數 3761 閱讀 7900

指標從狹義上來說就是位址,是個編號。

指標產生的意義:只是多了一種引用資料的方式。

這裡就要說到資料的引用方式:直接引用間接引用

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;

int *p;

p=&a;

其中: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;//一級指標

int **q;//二級指標

int ***k;//**指標

e.g:舉幾個例子來熟悉指標的使用

指標指向

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;

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指向的位址發生改變

d.指標注意事項

(1).指標變數必須先指向後使用

int *p;

*p=30;

//上述指標變數p為「野指標變數」,指向空間不明確

//應將野指標變數變為可控制的指標變數,現做如下操作:

int *p;

p=null;

(2).指標變數的基型別必須相同

double a=3.14;

int *p;

p=&a;

//上述方法會導致 *p取出的值未知。因為 *p和a的基型別不同,double型的a占用記憶體8個位元組,而指標變數p只能引用占用記憶體4個位元組的int型別的一般變數。

(3).指標變數賦值的三種方法

1.通過&賦值

int a=3,*p,*q;

p=&a;

2.指標變數之間相互賦值

int a=3,*p,*q;

p=&a;

q=p;

3.通過動態記憶體空間申請函式賦值

兩個函式:malloccalloc

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語言。當然最令人印象深刻的是指標。指標是存放著變數的位址的變數的資料型別,換言之,指標變數儲存的是變數的位址值,由於指標可以直...