C語言總結(三)

2021-07-31 21:40:55 字數 2655 閱讀 2301

二級指標也是指標變數,指標都是儲存位址的變數,而二級指標是儲存所指向的一級指標變數的位址,通過二級指標的解引用可以得到一級指標變數。

二級指標作為函式引數

作用:在函式外部頂乙個指標p,在函式內給指標賦值,函式結束後對指標p神效,那麼我們就需要二級指標。

**pt1(0x003)————>*pt2(0x002)————>p(0x001)

0x002——————–0x001———————–12

編譯器總是要為函式的每個引數製作臨時副本,在使用一級指標作為引數,進入函式前編譯器會給指標引數建立臨時副本,該副本和外部指標引數儲存的內容是一樣的,但是不是同一塊記憶體位址,如果在函式內部修改指標引數的內容,修改的只是副本的內容,而不會影響外部指標引數的內容,所以如果想在呼叫函式修改外部指標引數的值,需要參入外部指標的位址。這時就需要使用到二級指標。

可以使用c語言對變數中的個別位進行位操作。c提供邏輯運算子和移位運算子。

按位取反~

unsigned char a = 2;//00000010

unsigned char n = ~a;//11111101

按位與&

(10010011)&(00111101) = (00010001)
按位或|

(10010011)|(00111101) = (10111111)
按位異或^

(10010011)^(00111101) = (10101110)
轉置位

轉置乙個位表示如果該位開啟,則關閉該位;如果該位關閉,則開啟該位

flag^0xff  = (10010011)^(11111111) = (01101100);
不使用臨時變數交換兩個數

a = a ^ b; 

b = a ^ b;

a = a ^ b;

分析下a和b發生交換的原因:乙個整數異或本身為0,任意乙個整數異或0為本身。

根據以上**不難得出以下表示式:

1.b=(a^b)^b=a^b^b=a

2.a=(a^b)^[(a^b)^b]=a^b^[a^b^b]=a^b^a^b^b=a^a^b^b^b=b

根據前面說的前置知識,不難明白a和b,為什麼發生交換了。

左移 <<

左移運算子《將其左側運算元的值的每位向左移動,移動的位數由其右側運算元指定。空出來的位用0填充,並且丟棄移除左側運算元末端的位。

(10001010) << 2 = (00101000)

左移一位相當於原值*2

右移

右移運算子》將其左側的運算元的值每位向右移動,移動的位數由其右側的運算元指定。丟棄移出左側運算元有段的位。對於unsigned型別,使用0填充左端空出的位,對於有符號型別,結果依賴於機器。空出的位可能用0填充,或者使用符號(最左端)位的副本填充。

一維陣列

陣列是相同型別的變數的有序集合,在記憶體空間中為一大片連續的記憶體空間。

陣列名的值是乙個指標常量,也就是陣列第乙個元素的位址,它的型別取決於陣列元素的型別

指標和陣列名不是等價的,陣列名在表示式中使用的時候,編譯器才會產生乙個指標常量。

作為函式引數的陣列名

編譯器接受陣列形式的函式形參,此時函式的形參實際上是乙個指標,指向陣列第乙個元素的指標。

陣列指標:指向陣列的指標 char num = 「abcd」; char *p = num;

指標陣列:陣列元素為指標的陣列 char *num = ;

多維陣列

多維陣列陣列名,一維陣列陣列名的值是乙個指標常量,是指向陣列的第乙個元素的指標,多維陣列的陣列名也是指向第乙個元素,只不過第乙個元素的是乙個陣列。

c語言允許使用者自己指定這一種資料結構,它由不同的型別的資料組合成乙個整體,以便引用,這些組合在乙個整體中的資料是相互聯絡的,這樣的資料結構稱為結構體。

宣告乙個結構體型別的一般型別如下:

struct 結構體名

結構體名,用作結構體型別的標誌,它又稱為結構體標記,大括號內是該結構體的各個成員,由它們組成乙個結構體,對各成員都應進行型別宣告

定義結構體型別時不要直接給成員賦值,結構體只是乙個型別,編譯器還沒有為其分配空間,只是根據其型別定義變數時,才分配空間,有空間後才能賦值。

在涉及到結構體拷貝的時候,會出現深拷貝和淺拷貝的問題,淺拷貝只是將結構體指標指向同一片位址空間,而深拷貝才是真正的拷貝了乙份儲存在另乙份自己的位址空間裡面。在進行深拷貝的時候需要進行位址空間的開闢。

結構體的成員的偏移量,結構的成員定義下來了,則結構體的成員變數的記憶體布局就定下來了

在結構體成員變數中存在著記憶體位元組對齊的問題

記憶體對齊原因

記憶體的最小單位是乙個位元組,當cpu從記憶體讀取資料的時候,是乙個個位元組讀取,但是實際上cpu將記憶體當成多個塊,每次從記憶體讀取乙個塊,這個塊大小可能是2、4、8、16等。這樣是為了提高記憶體訪問效率

對於標準資料型別,它的位址只要是它的長度的整數倍

對於非標準資料型別,比如結構體,要遵循對齊原則:

手動設定對齊模數

C 語言總結(三)

在c語言中,變數和函式 分開來宣告的 也就是說,語言本身並沒有支援 資料 和 函式 之間的關聯性我們吧這種方法稱為 程式性的 由一組 分布在各個以功能為導航的函式中 的演算法驅動,他們處理的是共同的外部資料。在c 中,實現了封裝,資料和處理資料的函式是分開儲存的。c 類物件中的變數和函式是分開儲存的...

C語言總結(三結構)

結構有三種,順序結構,選擇結構,迴圈結構。這三種就可以滿足所有程式設計的框架。選擇結構有兩種if和 if.else 的巢狀使用非常靈活,當然 if也可以單獨使用,題目中總會有 else 的判斷,規則就是和最近的 if配對。switch witch 表示式 其語義是 計算表示式的值。並逐個與其後的常量...

c語言 c語言常見程式設計題總結(三)

30.求乙個數的二進位制序列中1的個數。include int main printf count d n count return 0 include int main num num 2 num num 1 i 1 printf count d n count return 0 x x x 1 ...