關於C語言學習中一些細節和疑惑的記錄(2)

1.強制類型轉換

對於printf()任何小於int類型的數字都會被轉爲int類型的數字輸出,float會被轉爲double類型輸出。

對於scanf()則不會這樣。

2.優先級

!>&&>||

3.函數的聲明與定義

函數在使用之前必須先聲明再使用。

4.指針學習:

   (1)指針應用場景a:通過指針來實現交換兩個數的值

      

 

(2)指針應用場景b:

函數返回多個值,某些值就只能通過指針返回 ;

傳⼊的參數實際上是需要保存帶回的結果的變量

(3)

int* p,q;
int *p,q;

這兩種方式都只是聲明瞭p爲指針型變量,p只是普通型變量。

(4)指針最常⻅的錯誤:

定義了指針變量,還沒有指向任何變量,就開始使⽤ 指針

5.指針與數組

(1)函數參數表中的數組實際上是指針

(2)數組變量是特殊的指針

     • 數組變量本⾝表達地址,所以

     • int a[10]; int*p=a; // ⽆需⽤&取地址

     • 但是數組的單元表達的是變量,需要⽤&取地址

     • a == &a[0]

     • []運算符可以對數組做,也可以對指針做:

     • p[0] a[0]

     • *運算符可以對指針做,也可以對數組做:

     • *a = 25; • 數組變量是const的指針,所以不能被賦值

     • int a[] int * const a=…

區分下面三種表達方式:

int i;
const int* p1 = &i;
int const* p2 = &i;
int *const p3 = &i;

判斷哪個被const了的標誌是const在*的前⾯還是後⾯。

第一二種屬同種情況,表⽰不能通過這個指針去修改那個變量(並不 能使得那個變量成爲const)

第三種情況表示⼀旦得到了某個變量的地址,不能再指向 其他變量

6.關於指針加1的問題

指針加1加的數量是該指針類型的大小,相當於數組的下一位。

7.指針的類型

• ⽆論指向什麼類型,所有的指針的⼤⼩都 是⼀樣的,因爲都是地址

• 但是指向不同類型的指針是不能直接互相 賦值的

8.C99之後可以用變量來聲明數組的大小,C99之前則用malloc()函數動態申請內存空間

動態申請內存空間需要記住三點

9. 字符串

hello會被編譯器變成⼀個字符數組放在某處,這 個數組的⻓度是6,結尾還有表⽰結束的0

很多人說char*是字符串,char*不一定是字符串

• 字符串可以表達爲char*的形式

• char*不⼀定是字符串

• 本意是指向字符的指針,可能指向的是字符 的數組(就像int*⼀樣)

• 只有它所指的字符數組有結尾的0,才能說它 所指的是字符串

scanf輸入字符串:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章