【指標應用場景】
1.函式需要返回多個值,其中一些值可通過指標返回。傳入的指標引數其實是需要儲存帶回結果的變數;
例程:
#include #include void swap(int* a,int* b);
int main()
void swap(int* pa,int* pb)
2.需要傳入較大的資料時用作引數;
3.傳入陣列後對陣列做操作;
4.動態申請記憶體。
int *a;//定義了乙個指標變數,不知道指向**(可能指向一塊寫操作非法區域)。
*a=5;//此時寫,可能會訪問非法記憶體,段錯誤,程式異常終止。
int *a=0;//指向0位址,0位址是乙個不能隨便碰的位址。
*a=5;//此時寫入,程式一定會崩潰。
【0位址】
(1)返回的指標時無效的;
(2)指標沒有被真正初始化(先初始化為0,後面如果沒有對該指標真正初始化,就對其進行操作,就一定會造成程式崩潰)。
2.c語言預先定義的null(全大寫哦~),表示0位址。
3.申明指標的時候,用null對其初始化是乙個程式設計的好習慣!
【指標運算】
指標可以做加減、比較運算,不能做乘除運算。
int main()
; char* cp=ac;
printf("cp=%p\n",cp);//其中,%p表示輸出指標的值。
printf("cp+1=%p\n",cp+1);
int ai=;
int* ci=ai;
printf("ci=%p\n",ci);
printf("ci+1=%p\n",ci+1);
return 0;
}
執行結果:
sizeof(char)=1,sizeof(int)=4
但是,如果有int ci1=&ai[3],不要以為ci1-ci會等於18,實際等於3。表示兩個位址之間有三個int單元。
【*p++】
接上面乙個**段:
while(*cp!=-1)
printf("%d\n",*cp++);
執行結果為:
【指標型別轉換與void*】
1.無論指向什麼型別,所有的指標大小都是一樣的,都是位址;
2.為了避免用錯指標,指向不同型別的指標不能相互賦值(不要忘記不同型別資料sizeof的結果不同喲~);
3.void*表示不知道指向什麼的指標。計算時與char*相同,但不相通。常用在底層程式設計中。;
4.指標轉換型別:int* p=&i;void* q=(void*)p;沒有改變p所指變數的型別,只是q看待p所指的百年來那個為void型別。(excuse me????)
翁愷C語言程式設計 學習筆記5
變換看待方式,還有unsigned 在計算機內部,一串字元在現實中表示什麼取決於用什麼樣的方式去看待它,比如 d與 u同樣輸出同乙個位串,會不一樣。字面量,是在編譯器編寫介面裡的內容,可以有比如012表示8進製,編譯器會自動將其轉成10進製,但是這是編譯器這個層面的事情,在計算機底層只有2進製。進製...
翁愷 程式設計高階C語言筆記 結構型別
結構型別 列舉 列舉是使用者定義的資料型別,用來表示依此排列的常量 常量型別只能是 int,常量大小是從0到n 列舉型別裡的名字通常不是真的使用,要使用的是大括號裡的常量名字。定義列舉的意義就是給這些常量定義一些名字 enum colors red 0.voidf enum color c int ...
C語言程式設計高階 翁愷 指標與字串
1.傳入函式的數組成了什麼?函式引數表中的陣列實際上是指標,sizeof a sizeof int 可以用陣列運算子來進行計算,以下四種函式原型等價。int sum int arr,int n int sum int int int sum int arr,int n int sum int int...