翁愷C筆記 指標

2021-07-16 14:41:34 字數 1466 閱讀 1105

【指標應用場景】

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...