C語言一些小點的複習

2021-09-22 18:47:21 字數 4601 閱讀 9597

int mian(void)

//"hello world",多位元組字串,字元佔空間大小不一樣

//l"hello world",unicode編碼,每個字元都是佔相同編碼,核心採用這種

//_t("***x"),自適應,取決於專案的巨集。

//'a',char,asic,乙個位元組

//l'a'wchar_t,unicode,windows兩個位元組,linux四個位元組

'0',0,'\0',"0",null,nullptr,

第乙個是字元0,值是48,第二個整數0,第三個值是0,是字串結尾的0,第四個是字串,其實是"0\0",

c:#define null (void*)0

c++:

#define null 0

null指標空,nullptr是c++的空,c++11後的標準。

c++不允許直接將void*隱式轉化為其他型別,比如null被定義成(void*)0

但當編譯char *p=null,就會編譯出錯,比如產生二義性,如在c++有函式過載

void func(int)和void func(char*),呼叫得的第乙個,不合理,所以引入nullptr,區分0和null。

nullptr的型別為nullptr_t,不是整數型別,能夠隱式轉換為任何指標。所以空指標推薦使用nullptr。

比如上面兩個函式傳入引數0和nullptr就可以分開了。

100,4位元組,int,long

100i64,64位整數8個位元組。_int64,long long

char 是unsigned char/signed char由編譯器覺得,比如在vc是有符號。

除錯的基本手段

%c是char,%wc%c是wchar,%hd是short,%ld是long,%i64d是_int64八個位元組,%lldlong long或者_int64。%u是無符號整數,%x16進製制,%o8進製檔案屬性,%p指標,%f是float但進度浮點數,%lf雙精度,%z是ansi_string,%wz unicode_string,在驅動中,以長度結尾,其實是個結構體,%n被禁用,%%轉義字元列印百分號,%02x列印2位16進製制數,不夠用0填充,一般是md5值,

%.2f保留浮點數後2位

printf("hello world");

printf("%s","hello world");如果寫死引數,這兩個是一樣的,

如果是引數比如buf,就是第二種好,會造成格式化串溢位漏洞,比如給的是("%s,%d,%n,%x");

第乙個就會理解為變參函式按著這種格式列印棧上的資料。會產生安全漏洞。中間的%n還能修改資料。%n是前面字串子樹的個數。

sizeof是個關鍵字,在編譯時候就確定了,函式大部分是執行的時候確定的。

計算結構體對齊的時候,要自然對齊,目的是提高cpu速度

1.每個個成員存放在記憶體是自身大小的整數倍。比如char是任意,short就是偶數的位址。long就是4的倍數的位址。

2.必須是最大成員的整數倍

另外還可以加#pragma pack(n)指定對齊粒度

棧對齊就是x86是4位元組,float,double8位元組,x64都是16位元組對齊,形參部分入棧是8位元組入棧,對齊

4. 分析下列程式中每個變數的儲存位置,作用域,與生命週期.

int a = 0; 

char *p1; 

static int x = 10;

int main(void) 

int b = 0; 

char s1 = "123"; 

char *p2; 

char *s2 = "123"; 

static int c =0;

p1 = (char *)malloc(128); 

p2 = (char *)malloc(256); 

free(p1);

free(p2); 

return 0; 

變數型別

變數儲存空間

變數作用範圍

變數生命週期

a全域性初始化變數

.data

整個工程       

程式執行週期      

p1全域性未初始化變數          

.bss 是0

整個工程       

程式執行週期

x全域性靜態變數

.data          

當前文件(避免命名衝突)      

程式執行週期

b區域性變數

棧           

函式內部      

函式執行週期       

s1區域性變數           

棧           

函式內部       

函式執行週期       

p2區域性變數

棧           

函式內部       

函式執行週期       

s2區域性變數

棧函式內部

函式執行週期 

c靜態區域性變數          

.data         

函式內部      

程式執行週期       

靜態區.data:全域性初始化的變數,編譯時候就確定了,並將其編譯進了可執行檔案,經過反彙編能找到。可以使exe膨脹。

.bss:全域性未初始化變數,執行時候手動編寫彙編**將其初始化,不佔實際磁碟空間,只在段表記錄大小,符號表記錄符號。檔案載入執行時,才分配空間

.rdata:全域性唯讀,同理.data。

只有乙份123,把rdata的值拷貝到棧上。

全域性變數同乙個檔案中先定義先初始化,不同不確定

①(char)(127<<1)+1= 

127是4位元組,右移一位,強轉char就是截斷,然後加1,因為1是4位元組整型,又要擴充(用符號位擴充)

127四位元組:00 00 00 7f

左移一位 00 00 01 fe

所以 char強制轉化之後就是 fe 二進位制11111110

加1,會強制轉化為大的,補符號位,11111110符號1所以**1全部是32個1,所以是-1;

②(char)(-1>>1)+1= 

-1是32個1,右移,這裡是算術右移,符號填充(邏輯才是0填充)

加1就是0

③1<<2+3=

考點優先順序,相當於1<<5

④(15&240)+((2^100)%7)=2(此處2^100表示2的100次方)

15&240=0;2^100=2*2^99=2*(2^3)^33=2*(8)^33=2(1+7)^33=2(1^33+1^32*7++2^31*7^2。。。。)二項式展開,後面都有7,只有第一項沒有所以最後是2

⑤(char)(-128*-1)=-128

1位元組有符號數是-128到127,整數上溢變最小數,下溢最大數。

⑥(2018^2018)+(20180818^0)=20180818

⑦1^2^4^5^6...^1024=(即整數從1到1024,除了3之外所有數的異或)

1異或到n,結果是n,所以如果異或加上3,是1024.

(1^2^3...^x...^1024)^x=1^2^3^....^1024(中間少個異或x)

所以結果為1024^3=1027

⑧(0x12345678>>24)&0xff=

(0x12345678>>24)=0x12&0xff=

0x12

⑨ 0x12345678 | ~0xfffeffff =

~0xfffeffff =0x00010000

0x12345678 |0x00010000=0x12355678

⑩假如36進製的規則為「0123456789abcdefghijklmnopqrstuvwxyz」。 比如常見10進製與36進製對應關係: 1=「1」,10=「a」,20=「k」,35=「z」,36=「10」 。 那麼10進製128對應的36進製為:

3kx86是低位優先

任何數與他自己減1相與就是將其最右邊的1置0

可以用來統計乙個數中有多少個二進位制的1

void fun(char c) 

printf("%d\n" , sizeof(c)); 

void fun2(char &c) 

printf("%d\n" , sizeof(c)); 

void fun3(char(&c)[9]) //陣列的引用,所以就是陣列的長度,所以必須傳長度正確的輸出,這裡就是9

printf("%d\n" , sizeof(c)); 

int main() 

char c = "12345678"; 

printf("%d\n" , sizeof(c));//①

fun(c);//②

fun2(*c);//③

fun3(c);// ④

return 0; 

按照程式執行順序輸出結果為:

①:9②:4//陣列作為形參傳入函式,會退化為指標。

③:1傳的字元的引用,*c就是字元1

④:9

django flask的一些小點

1.django中路由有path和re path兩種 通過re path傳參也有命名匹配和分組命名匹配兩種 分組匹配 re path r index d v iews ind ex 分 組命名匹 配rep ath r da te p ar 0 9 4 p nt h 0 9 2 views.index...

recyclerview使用時的一些小點

解決 padding不隨著滑動的情況 android cliptopadding false 解決鑲嵌 scollview滑動不流暢問題 myrecylinearlayout layout new myrecylinearlayout getactivity layout.setsmoothscro...

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.不支援字元陣列的直接賦值,需要...