001 c語言查漏補缺1

2021-09-27 12:09:54 字數 3254 閱讀 8096

#和##區別

#將右邊的引數做整體的字串替換。

##將左右兩邊的引數做整體的字串拼接替換。

#include

#define f(a,b) a##b

#define g(a) #a

#define h(a) g(a)

intmain()

c語言中嵌入彙編:

atpcs規則(arm/thumb procedure call standard):規定子程式間呼叫規則,暫存器呼叫規則,堆疊使用規則,引數傳遞規則

彙編**簡潔,直接內嵌彙編,否則要將匯程式設計序以檔案形式加入專案中,按照atpcs規則與c程式相互呼叫與訪問

__asm__

("instruction"..

."instruction"

);

* ads中支援
__asm

(instruction

...instruction)

;

* arm c++支援
asm

("instruction[;instruction]"

);

預編譯

① 型別1

#if defined(macro1) || (!defined(macro2) && defined(macro3))..

.#else..

.#endif

② 型別2

#define something 1

#if something == 1..

.#else..

.#endif

③ 型別3

#define something 1

#if defined (somethong)..

..#else

#endif

④ 型別4

#define something 1

#if something == 1..

.#elif something == 2..

.#endif

volatile要點

使用了volatile的變數在使用優化語句是for()迴圈並沒有得到優化,因為for()迴圈執行的是乙個空操作,那麼通常情況下使用了優化語句使得這個for()迴圈被優化掉,根本就不執行。就好比編譯器在編譯的過程中將i的值設定為大於或者等於10000000的乙個數,使得for()迴圈語句不會執行。但是由於我們使用了volatile,使得編譯器就不會自作主張的去動我們的i值,所以迴圈體得到了執行。舉這個例子的原因是要讓讀者牢記,如果我們定義了volatile變數,那麼它就不會被編譯器所優化。

當然volatile還有那些值得注意的地方呢?由於訪問暫存器的速度要快過直接訪問記憶體的速度,所以編譯器一般都會作減少對於記憶體的訪問,但是如果將變數加上volatile修飾,則編譯器保證對此變數的讀寫操作都不會被優化。

#pragma關鍵字

在所有的預處理指令中,#pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了乙個方法,在保持與c和c++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。

結構體位元組大小問題

struct a

;struct b

;

sizeof(a) = 24; int為4,double為8,float為4,總長為8的倍數,補齊,所以整個a為24。

為什麼sizeof(a)不是16,原則1寫明後面每個資料成員儲存的起始位置要從該成員(自身)大小的整數倍開始(如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。即struct a裡面的double b要從8的倍數開始,因為前面是4個位元組,所有要補夠四個,使double b從位址8開始,

sizeof(b) = 48;

b的記憶體布局:11* *(e), 1111(f), 11111111(g), 11* *****(h),1111****(i), 11111111(i), 1111****(i)

i其實就是a的記憶體布局。i的起始位置要為8的倍數,所以h後面要補齊。把b的記憶體布局弄清楚,有關結構體的對齊方式基本就算掌握了。

字串常量和字元變數區別

字元『a』只占用1個字元,字串常量「a」佔兩個字元。

因為建立字串常量時候,系統自動在字串後加上乙個null。

typedef使用

char

* pa,pb;

//pa是指標變數,pb是字元變數

typedef

char

* pchar;

pchar paa,pbb;

//paa是指標變數,pbb是指標變數

char line[81]

;char text[81]

;

typedef

char line[81]

;

line text,secondline;

//text和secondline都是81個元素的陣列

getline

(text)

;

typedef

char

* pstr;

intmystrcmp

(pstr,pstr)

;//標準庫函式strcmp(const char*,const char*)

intmystrcmp

(const pstr,

const pstr)

;//當我們這樣使用時,gnu的gcc和g++編譯器會報錯,把const pstr解釋為 char * const,並不是我們想象中的解釋為 const char *,改正方法如下

typedef

const

char

* pstr;

C語言查漏補缺

char a 2 20 a 1 hello 這是錯誤的。c語言把這語句解釋為乙個指標與另乙個指標之間的 非法的 賦值運算。但是在初始化時,char a 2 20 是允許的。對於字串陣列,可以使用 法1 char strs 2 strs 1 hello 法2 char strs 2 20 strcpy...

查漏補缺 1

1.alert 用來顯示一段文字。不是文字強制轉換為文字。2.sort 排序,原理是根據unicode進行排序,可接受乙個比較函式。比較函式 function compare a,b else if a b else var values 0,5,10,5,65 values.sort compar...

c語言查漏補缺 指標

1,表示式 p 和 優先順序相同,結合方向自右向左,因此等價於 p 也就是先得到p所指向的變數值 p 再使p p 1。注意區別 p 先取得當前p所指向的變數值,再使p指向後乙個變數,相當於a i p 先取得當前p所指向的變數值,再使p指向前乙個變數,相當於a i p 先使p指向後乙個變數,再取得當前...