程式設計總結 關於C語言的一些小細節

2021-09-27 02:17:17 字數 3465 閱讀 2012

1.c語言不能夠使用基本賦值運算子 「=」為陣列賦值,即 b=a;這樣的賦值是錯誤的。如果要賦值,可以用for語句為陣列的元素逐一賦值

2.賦值運算子「=」具有右結合性, min = max = fenshu[0],需要理解成 min = (max = fenshu[0])

3.字元常量的型別是int型別,除此之外,還存在顯示字元的char型別

void put_chars(int ch , int n)

put_chars(' ', 5) //輸出5個空格,空格是作為int型別引數傳入函式的

4.為函式傳遞陣列引數時,只要在呼叫該函式時,使用的實參寫陣列的名稱即可,不需要加""

int max_of(int v,int n);

//接收陣列的形參宣告為「型別名 引數名」,使用n來接收元素個數

int eng[number];

int mat[number];

max_e = max_of(eng,number); //eng為陣列名,不需要加

max_m = max_of(mat,number); //mat為陣列名,不需要加

5.在自定義函式的形參中加上const型別修飾符,可以進製在函式內部修改傳入的引數的值(例如禁止修改接收到的陣列內容)

void print_array(const int v,int n);

//本函式只能夠列印陣列元素,無法修改陣列元素的值,如果修改,編譯器會報錯

6.建立多維陣列/函式接收多維陣列。陣列元素個數可以不規定,但是元素的型別必須固定

void func1(int v, int n); // 元素型別為int,元素個數隨意(n)

void func2(int v[3], int n); // 元素型別為int[3],元素個數隨意(n)

void func3(int v[2][3], int n); // 元素型別為int[2][3],元素個數隨意(n)

//函式接收的陣列的元素型別必須固定,元素個數是自由的

7.元素型別為int型的陣列,稱為int陣列;元素型別為int型別,個數為n的陣列,寫作int[n]型,陣列型別為int[n]

8.printf函式中%u轉換說明表示unsigned型的無符號整型數值,%d以十進位制數的形式顯示,%o以八進位制顯示,%x%x以十六進製制顯示

9.按位運算子,&、^、|、~的運算元必須整數類資料型別或者是列舉型,不可應用於浮點型等資料型別的運算元

10.位移運算子<<、>>的運算元必須是整數類資料型別或者列舉型

11.浮點型數x經過迴圈累加0.01到1.0後,最後的x的值是0.999999而不是1.0,這是因為計算機不能夠保證其內部轉換為二進位制的浮點數的每一位都不發生資料丟失,因此將1000份的誤差積累在x中(明解c語言p225)

12.union聯合體的長度問題

union的長度取決於其中的長度最大的那個成員變數的長度。即union中成員變數是重疊擺放的,其開始位址相同。

其實union(共用體)的各個成員是以同乙個位址開始存放的,每乙個時刻只可以儲存乙個成員,這樣就要求它在分配記憶體單元時候要滿足兩點:

1.一般而言,共用體型別實際占用儲存空間為其最長的成員所佔的儲存空間;

2.若是該最長的儲存空間對其他成員的元型別(如果是陣列,取其型別的資料長度,例int a[5]為4)不滿足

整除關係,該最大空間自動延伸;

我們來看看這段**:

union mm;

本來mm的空間應該是sizeof(int)*5=20;但是如果只是20個單元的話,那可以存幾個double型(8位)呢?兩個半?當然不可以,所以mm的空間延伸為既要大於20,又要滿足其他成員所需空間的整數倍,,因為含有double元長度8,故大小為24。

所以union的儲存空間先看它的成員中哪個佔的空間最大,拿他與其他成員的元長度比較,如果可以整除就行。

13.為絕對位址的資料賦值

//設定一絕對位址為 0x67a9 的整型變數的值為 0xaa66

int *ptr;

ptr = (int *)0x67a9;

*ptr = 0xaa55;

//方法二

*(int * const)(0x67a9) = 0xaa55;

14.讓程式跳轉到絕對位址是 0x100000 去執行

*((void(*)( ))0x100000 ) ( ); 

/***

首先要將 0x100000 強制轉換成函式指標,

即: (void(*)())0x100000 然後再呼叫它:*((void (*)())0x100000)();

用 typedef

可以看得更直觀些:

typedef void(*)() voidfuncptr;

*((voidfuncptr)0x100000)();

**/

15.typedef定義函式指標

typedef char (*ptrfun)(int); 

ptrfun pfun;

char glfun(int a)

void main()

tpyedef定義了乙個新型別,定義了乙個ptrfun型別,這個型別是指向某個函式的指標,這個函式的返回值為char型別,引數為int型別。這裡的typedef用法和普通的增加別名用法不一樣,具體可以參考

第二行的**便使用這個新型別定義了變數pfun,此時就可以像使用形式1一樣使用這個變數了。

參考:16.typedef struct和指標

typedef struct student

student, *pstudent;

student為struct student的別名

pstudent為struct student* 的別名,是乙個結構體指標的別名

等價於

struct student

typedef struct student student;

typedef struct student *pstudent;

student *xuesheng等價於 pstudent xuesheng

參考資料:

C語言筆記 一些小細節

2.char ex 5 4 scanf s ex 無需取位址符 因為字元陣列本身是指標。3.12s中 表示向左對齊 預設向右對齊 12 表示佔12個位元組。4.定義乙個陣列,比如char ex n n應為恒量,如 define n 5 或const int n 5 5.不支援字元陣列的直接賦值,需要...

C 一些小細節

一 class 類 與 inlcude 類.h 的區別 class 類的使用,只是宣告有這麼乙個類,但是沒辦法呼叫類裡面的函式 而 include則可以 例如 pragma once include cocos2d.h include class scenemanger using ns cc cl...

關於QPushButton的一些小細節

在公司進行乙個project的時候,需要用到大量的button控制項,這裡邊出現了很多很有意思的小問題,我覺得還是很需要注意的。1 建乙個qpushbutton物件,當往上邊貼一張image時,在windows下是沒有問題的,但是對於qt for symbian而言 貼上去的紋理卻會變淡,這個我曾反...