日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c语言编写经验逐步积累3

發(fā)布時(shí)間:2024/9/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言编写经验逐步积累3 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
版權(quán)聲明:本文為CSDN博主(天才2012)原創(chuàng)文章。未經(jīng)博主同意不得轉(zhuǎn)載。 https://blog.csdn.net/gzzaigcn/article/details/27114097

寥寥數(shù)筆。記錄我的C語(yǔ)言盲點(diǎn)筆記,僅僅為以前經(jīng)歷過(guò)。亦有誤,可交流。

?

1.typedef來(lái)定義一個(gè)函數(shù)指針類型的方法,定義一個(gè)新的函數(shù)指針類型。:建立一個(gè)類型別名的方法非常easy,在傳統(tǒng)的變量聲明表達(dá)式里用類型名替代變量名,然后把keywordtypedef加在該語(yǔ)句的開頭”。

typedef int (*PFUN)(): 定義PFUN這個(gè)函數(shù)指針類型,由編譯器自己主動(dòng)來(lái)完畢,比方PFUN pfun;定義了一個(gè)函數(shù)指針,相似于抽象出一種新的變量類型。


typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short event );
pTaskEventHandlerFn tasksArr[];//申明函數(shù)指針的數(shù)組
使用typedef將一個(gè)類型名字替代原先申明時(shí)的變量名。然后類型名能夠用來(lái)申明定義變量。


2.有初始化的數(shù)組定義能夠省略方括號(hào)里的數(shù)組大小。

  比如,以下的代碼中數(shù)組定義為5個(gè)元素:
    int a[]={2,4,6,8,10};
  編譯時(shí)必須知道數(shù)組的大小。

通常,聲明數(shù)組時(shí)方括號(hào)內(nèi)的數(shù)字決定了數(shù)組的大小。

有初始化的數(shù)組定義又省略方括號(hào)里的數(shù)組大小時(shí)。編譯器統(tǒng)計(jì)花括號(hào)之間的元素個(gè)數(shù),以求出數(shù)組的大小。
  比如,以下的代碼產(chǎn)生同樣的結(jié)果:
    static int a1[5]={1,2。3,4,5};
    static int a2[]={1。2。3,4,5};

2,棧頂一般為低地址,函數(shù)入棧一般參數(shù)從右往左進(jìn)行。
3.for(a;b;c){e}運(yùn)行順序:先進(jìn)行a, 然后是b, 運(yùn)行e, 在運(yùn)行c.進(jìn)一步運(yùn)行b,運(yùn)行e,c.直到b不再滿足退出循環(huán)。
4.union數(shù)據(jù)類型。內(nèi)存是重疊的,全然一樣typedef union {
? uint32 time32;
? uint16 time16[2];
? uint8 time8[4];
} osalTime_t;
對(duì)time32的賦值后,訪問(wèn)其它類型時(shí)依然是原來(lái)的內(nèi)存。

三個(gè)成員占領(lǐng)一樣的數(shù)據(jù)空間。起始地址都是一樣的,一旦一個(gè)成員數(shù)值變化就會(huì)出現(xiàn)其它成員取值也發(fā)生變化


5.inline內(nèi)聯(lián)函數(shù)總結(jié)內(nèi)聯(lián)函數(shù)具有代碼量小且直接編譯進(jìn)可運(yùn)行文件里,不進(jìn)行call調(diào)用,也就是在不同的文件的函數(shù)假設(shè)調(diào)用內(nèi)聯(lián)函數(shù)。則不同的函數(shù)都會(huì)出現(xiàn)該內(nèi)聯(lián)函數(shù)的可運(yùn)行代碼??墒?#xff0c;假設(shè)不反復(fù)調(diào)用的話。內(nèi)聯(lián)函數(shù)帶來(lái)的優(yōu)點(diǎn)就是運(yùn)行更加高速,無(wú)需再call,以及函數(shù)參數(shù)的出入棧SP。保護(hù)棧幀,跳出函數(shù),清空棧幀等各種耗時(shí)。起到高速運(yùn)行的效果。故內(nèi)聯(lián)函數(shù)的代碼量都較小。總之是以添加運(yùn)行文件大小來(lái)獲取程序運(yùn)行速度的提高。
6.(int *)0,表示指向一個(gè)整形的地址。地址值為0。即空指針?biāo)诘牡胤?#xff0c;該處一般不同意寫操作,以免破壞系統(tǒng)。但能夠讀取。
7.假設(shè)一個(gè)函數(shù)要被其它文件里函數(shù)使用,定義時(shí)加externkeyword。在沒(méi)有加extern和statickeyword時(shí)。一般編譯器會(huì)默認(rèn)是extern類型的,因此你在其它函數(shù)里調(diào)用也能夠使用。
8.結(jié)構(gòu)體之offsetof宏具體解析 ,#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) (include/linux/stddef.h)
9.32位機(jī)讀取一個(gè)字節(jié),實(shí)際底層的匯編做了進(jìn)一步的處理。比方讀取一個(gè)字節(jié)。實(shí)際返回的是一個(gè)32位,經(jīng)過(guò)屏蔽移位取得你要的地址所在的數(shù)。寫入時(shí)也一樣。會(huì)先保持4字節(jié)其它字節(jié)不變,然后單獨(dú)把要寫入的字節(jié)做改變。由編譯器依據(jù)你的數(shù)據(jù)類型來(lái)完畢實(shí)際的實(shí)現(xiàn)。32字節(jié)的讀取最為高效。
10.中斷發(fā)生時(shí),未完畢服務(wù)程序的處理時(shí)。將會(huì)忽略掛起Pending,優(yōu)先級(jí)高的中斷能夠獲取中斷使用權(quán)。還有一個(gè)同樣的中斷發(fā)生,直到當(dāng)前中斷處理完畢,才同意再次中斷進(jìn)入。


11.switch case誤區(qū)。

switch case往往對(duì)不同的命令進(jìn)行分類操作,可是假設(shè)出現(xiàn)遇到相應(yīng)case做完處理后,假設(shè)沒(méi)有遇到break就會(huì)接著默認(rèn)運(yùn)行以下的case內(nèi)容(不再去case,由于僅僅有剛進(jìn)入switch才會(huì)去匹配case,已經(jīng)進(jìn)入后,case匹配忽略)。直到遇到帶break后為止跳出case,否則一直運(yùn)行完。
由于僅僅在第一次才做switch推斷跳到相應(yīng)的內(nèi)容去運(yùn)行。

所以,好的程序基本是須要break的。可是有些情況(多個(gè)情況相應(yīng)處理的內(nèi)容要一樣,即前面的幾個(gè)類型能夠不做處理,不須要break。直到最后一個(gè)做處理,實(shí)現(xiàn)多個(gè)類型運(yùn)行同樣的功能,但不添加代碼量,更直接)。

總之,僅僅有在第一次才做推斷與選擇。進(jìn)入以后就是安裝順序運(yùn)行,不break會(huì)一直運(yùn)行到switch結(jié)束
12 C語(yǔ)言中的感嘆號(hào)。邏輯取反。不同于~的按位取反

=:表示不等于。。(1)表示為0,!

(0)表示為1,有取反之意,但僅僅能用在0和1上面。不等于0的會(huì)變?yōu)?,等于0的變?yōu)?



13.C語(yǔ)言+和<<遇到的一個(gè)BUG問(wèn)題。在這里+的優(yōu)先級(jí)高于<<左右移。所以比方a<<8+b,實(shí)際是從右往左賦值,8+b相加后來(lái)移動(dòng)a,所以不實(shí)現(xiàn)兩個(gè)字節(jié)合并為一個(gè)16位的數(shù)據(jù)。故要加(a<<8)+b才干實(shí)現(xiàn)本來(lái)的意圖。這個(gè)誤區(qū)須要注意。
14.:#define PINMUX0_31_28 0x00000001u,0x00000001ULu表示無(wú)符號(hào),UL unsigned long int 32位,unsigned long long 64位
15數(shù)組指針和指針數(shù)組的差別數(shù)組指針。為一個(gè)指針,int (*a)[10];指向一個(gè)數(shù)組,相似于函數(shù)指針指針數(shù)組。為一個(gè)數(shù)組。int* a[10];相似于指針函數(shù),返回的是一個(gè)指針。
16.window以下絕對(duì)路徑的文件須要用雙斜杠來(lái)表示\\
17 printf("c=%#x\n",c);什么意思?%#表示的輸出提示方式,假設(shè)是8進(jìn)制,在前面加0,假設(shè)是十進(jìn)制。不加不論什么字符。假設(shè)是十六進(jìn)制,會(huì)自己主動(dòng)加上0x
18?靜態(tài)變量在編譯的時(shí)候初始化,所以初值必須是常量(能夠是常數(shù)、定義成常數(shù)的宏、C++編譯器中用const修飾的常量),靜態(tài)變量不能用變量賦初始值,但在運(yùn)行時(shí)是能夠用變量賦值的。


19 assert函數(shù),用于推斷是否為真,滿足就繼續(xù)運(yùn)行,不然直接終止程序的運(yùn)行20.做到4個(gè)字節(jié)對(duì)齊,使用例如以下方式:((CSL_CacheRegsOvly)CSL_CACHE_REGS)->L1DIWC? = ((byteCnt+3)>>2);字節(jié)數(shù)不為4的倍數(shù)時(shí)。須要多保留一個(gè)字的數(shù)量,故加3,1+3,2+3,3+3.4字節(jié)對(duì)齊的方式。獲得4字節(jié)對(duì)齊后的字節(jié)數(shù)字:byte_num = (byte + 3) & 0xfc; 這樣字節(jié)數(shù)必為4的倍數(shù)。
21 for循環(huán)中假設(shè)break,則i++不再運(yùn)行。
22.temp = (temp+1)&7.表示temp從0到7變化,循環(huán)。

相似于temp=8時(shí)賦值回0.


23.unsigned char *p;unsigned char a[];p=a;這樣正確。
unsigned int p1= a;錯(cuò)誤,由于是指針類型賦值給了整形的數(shù)據(jù)類型,類型不匹配。unsigned char * p[10]:申明一個(gè)指針數(shù)組,10個(gè)指針,每一個(gè)指針指向char類型的空間。unsigned char (*p)[10]申明一個(gè)數(shù)組指針。指向含有10個(gè)char類型的空間。指針維護(hù)一個(gè)10的空間。偏移1加10個(gè)空間。
24.多個(gè)if會(huì)進(jìn)行分支處理,分別推斷后進(jìn)行是否運(yùn)行。而if 和多個(gè)else if等配合時(shí)。一旦出現(xiàn)某個(gè)滿足條件時(shí),不再運(yùn)行以下的else if的推斷,確保僅僅進(jìn)入一個(gè)分支。

25.char a[3][4]. char **p =a;出現(xiàn)編譯錯(cuò)誤,類型不匹配不能賦值由于a表示的是一個(gè)指向一維數(shù)組的指針,即char (*a)[3]這個(gè)類型.a+1是會(huì)偏移3個(gè)單位。p是一個(gè)指針的指針,稱為二級(jí)指針。所以兩者類型不一樣。


26.數(shù)組名取地址在《C和指針》p142中說(shuō)到,在以下兩中場(chǎng)合下,數(shù)組名并非用指針常量來(lái)表示。就是當(dāng)數(shù)組名作為sizeof操作符和單目操作符&的操作數(shù)時(shí)。

sizeof返回整個(gè)數(shù)組的長(zhǎng)度,而不是指向數(shù)組的指針的長(zhǎng)度。?取一個(gè)數(shù)組名的地址所產(chǎn)生的是一個(gè)指向數(shù)組的指針,而不是一個(gè)指向某個(gè)指針常量的指針。
所以&a后返回的指針便是指向數(shù)組的指針(相似于(*p)[3]),跟a(一個(gè)指向a[0]元素的指針)在指針的類型上是有差別的。&a+1是偏移一個(gè)數(shù)組sizeof大小的尺寸,由于&a是指向數(shù)組指針的地址,是一個(gè)數(shù)值指針。

可是作為形參時(shí)。一級(jí)數(shù)組名就轉(zhuǎn)為了一個(gè)普通的一級(jí)指針而已。
27. 二維數(shù)組名不能簡(jiǎn)單的理解為2級(jí)指針,而是要從數(shù)組的系統(tǒng)結(jié)構(gòu)上去了解。個(gè)人覺(jué)得二維數(shù)組名事實(shí)上就是一個(gè)指針,可是他指向的數(shù)據(jù)類型是一維數(shù)組的這么個(gè)數(shù)據(jù)類型。即數(shù)值指針。事實(shí)上能夠理解為功能和二維數(shù)組名相似。至于數(shù)據(jù)訪問(wèn),全然是編譯器來(lái)自己主動(dòng)完畢棧區(qū)的訪問(wèn)。

28.數(shù)值名不能改動(dòng),是由于在棧區(qū)域內(nèi)已經(jīng)定好了ebp,基地址。

訪 問(wèn)數(shù)組都是基于這個(gè)ebp來(lái)進(jìn)行的。所以。給數(shù)組名賦值變得沒(méi)有意義,肯定不同意改動(dòng)ebp的。

所以在編譯階段就報(bào)錯(cuò)。


29.fseek和發(fā)tell配合來(lái)完畢確定文件大小的過(guò)程。fseek(fPtr,0,SEEK_END);file_size = ftell(fPtr);fseek(fPtr,0,SEEK_SET)。位置指針復(fù)位進(jìn)行讀寫操作

30.兩數(shù)交換不使用第三個(gè)緩沖區(qū)。三條代碼的方法:主要通過(guò)運(yùn)算符來(lái)實(shí)現(xiàn)。
A = A^B;B = A^B;A = B^A;
A = A+B;B = A-B;A = A-B;





?

轉(zhuǎn)載于:https://www.cnblogs.com/mqxnongmin/p/10812520.html

總結(jié)

以上是生活随笔為你收集整理的c语言编写经验逐步积累3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。