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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

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

?

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

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


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


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

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

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

有初始化的數(shù)組定義又省略方括號里的數(shù)組大小時。編譯器統(tǒng)計花括號之間的元素個數(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ù)從右往左進行。
3.for(a;b;c){e}運行順序:先進行a, 然后是b, 運行e, 在運行c.進一步運行b,運行e,c.直到b不再滿足退出循環(huán)。
4.union數(shù)據(jù)類型。內(nèi)存是重疊的,全然一樣typedef union {
? uint32 time32;
? uint16 time16[2];
? uint8 time8[4];
} osalTime_t;
對time32的賦值后,訪問其它類型時依然是原來的內(nèi)存。

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


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


11.switch case誤區(qū)。

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

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

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

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

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



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


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

相似于temp=8時賦值回0.


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

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


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

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

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

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

訪 問數(shù)組都是基于這個ebp來進行的。所以。給數(shù)組名賦值變得沒有意義,肯定不同意改動ebp的。

所以在編譯階段就報錯。


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

30.兩數(shù)交換不使用第三個緩沖區(qū)。三條代碼的方法:主要通過運算符來實現(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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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