關於c語言的指標(書中摘錄):
p=(char *)i;
*p=i&0x0f;
這兩句話翻譯為彙編:
movecx,i 是給ecx暫存器賦值
movbyte [ecx],(i&0x0f) 給ecx記憶體位址賦值
使得儲存他們的半導體都不一樣,乙個在cpu裡,乙個在記憶體晶元
如果將這兩句話的執行順序倒過來:
*p=i&0x0f;
p=(char *)i;
彙編變為
mov byte [ecx],(i&0x0f)
mov ecx,i
這樣在第乙個mov的時候,ecx的值還不確定,是個隨機數,導致i&0x0f的結果寫入記憶體不可知的位址中,後果很嚴重!!!
另:char *p; 宣告的是p(不要認為是*p)
重點2:*p 那麼p[i]是陣列嗎?
寫的不好的教科書裡,往往會說p[i]是陣列p的第i個元素。不算錯,可是很敷衍。
p[i]和*(p+i)意思完全相同。也就是說*p就是p[0]。
更加詭異的是,把p[i]可以寫成i[p]。甚至a[2]寫成2[a]也是完全沒問題的,不會報錯,也沒有警告。彙編翻譯過來完全一樣。這總不能說是名叫2的陣列的第a個元素吧?
所以p[i]是種省略寫法,本質上講,與陣列沒關係。
c語言中(「 」)表示該標頭檔案與原始檔位於同一資料夾裡。而(< >)則表示該標頭檔案位於編譯器所提供的資料夾裡。
/c primer plus
變數在其他檔案中定義,則用extern宣告就是必須的。
c99標準,允許在乙個**塊中任何位置宣告變數。花括號內宣告的變數盡在花括號內可見。if語句、for迴圈,如無括號(可視做預設使用花括號理解)。
有乙個外部變數hocus,如果其他函式沒有內部同名的hocus,則外部變數對其可見(也可宣告hocus為外部變數extern,用來增加可讀性)。如果有同名變數hocus,則同名變數為其內部變數。
儲存器類關鍵字,auto,register,static,extern,typedef(與記憶體儲存無關語法原因歸入此類)
malloc 用法 ptd=(double *)malloc(n*sizeof(double));使用動態記憶體往往導致程序比使用堆疊記憶體慢。
比如:數碼管顯示的陣列,陣列不想被修改,可以使用const定義。
volatile告訴編譯器該變數除了可被程式改變以外還可被其他**改變。(使用它的原因是方便編譯器優化)。
使用地方(編譯器每次使用都重新讀取數值):
一般說來,volatile用在如下的幾個地方:
1、中斷服務程式中修改的供其它程式檢測的變數需要加volatile;
2、多工環境下各任務間共享的標誌應該加volatile;
3、儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能有不同意義;
restrict通過允許編譯器優化某幾種**增強了計算的支援。只可用於指標,表明指標是訪問乙個資料物件的唯一且初始的方式。
///判斷檔案結尾
設計範例#1:
char ch;
file *fp
fp=fopen("wacky.txt","r");
ch=getc(fp);
while(ch!=eof)
設計範例#2:
char ch;
file *fp
fp=fopen("wacky.txt","r");
ch=getc(fp);
while(ch=getc(fp)!=eof)
#define 乙個用法:
#define psqr(x) printf("the square of "#x" is %d.\n",((x)*(x)))
此處#x稱為字串化。可以把引數名轉化為相應的字串。
使用巨集還是函式?空間時間的考量,用巨集實現**會拷貝插入到程式中,執行20次,就有20次拷貝。函式只有乙份拷貝。所以節省了空間。內嵌,執行速度更快。
巨集的另外乙個優點是,它不檢查其中的變數型別(無論int或是float都可以使用巨集sqare(x))。
巨集函式名,盡量使用大寫字母。
#include"" ""表示在當前目錄中尋找,然後系統目錄
#include<> <>表示在乙個或多個標準系統目錄中尋找檔案。
其他預處理指令
#undef用來取消定義乙個給定的#define.例如:有如下定義:define limit 400 則指令:#undef limit 會取消該定義。
條件編譯
#ifdef(#ifndef) #else #endif
另:可以應用在main函式內。
#if #elif指令
#if後可以接關係運算符合邏輯運算子(與if類似) #elif及為(else if)
先定義:
struct book
就計算機而言宣告:
struct book libry;
是以下宣告的簡化:
struct book libry;/*在定義之後跟變數名*/
可以進行初始化(用逗號隔開):
struct book libry=
也可以這樣做
struct book libry=;
.title .author 和.value在book結構中扮演了下標的角色
當要寫乙個與結構有關的函式。應該用結構指標作為引數,還是用結構作為引數和返回值呢?
指標作為引數優點:c90和c99標準通用,執行快;只需傳遞乙個單個位址。
缺點:缺少對資料的保護。(用const定義資料可以有效保護)
結構作為引數傳遞優點是函式處理的是原始資料的副本,比直接處理原始資料安全。程式設計風格往往更清晰。
通常程式設計師為了追求效率而使用結構指標作為函式引數;當需要保護資料、防止意外改變資料時對指標使用const限定詞。傳遞結構值是處理小型結構最常用的方法。
聯合union 乙個能再同一儲存空間裡(不是同時)儲存不同型別資料的資料型別。典型應用是一種表,設計它是用來以某種既沒有規律、事先也未知的順序儲存混合型別資料。
列舉型別 (enumerated type)
enum宣告代表整數常量的符號名稱。通過使用關鍵字enum,可以建立乙個新「型別」並指定它可以具有的值。列舉型別的目的是提高程式的可讀性。它的語法與結構的語法相同。
例如:可以這樣宣告 enum spectrum(red,orange,yellow,green,blue,violet);
enum spectrum color;
位運算:
開啟位flags|=mask;
關閉位flags=flags&~mask;
轉置位flag^=mask;
左移<<
空出的位用0填充
右移》空出的位:unsigned 使用0填充
有符號型別結果與機器有關,可能用0填充,或者使用符號填充。
在任何錯誤的電路上調程式,就是耍流氓。
在任何不穩定的電路上調程式,還不如耍流氓
「隨手記」意見整理
1.優點 框架比較美感,外觀設計比較吸引人 不足 功能沒有明顯劃分,新增賬單和顯示賬單單一化,比較死板。例如不能根據時間進行檢視,或著更改時間,自定義進行檢視顯示,除此之外功能單一,只有增加和顯示賬單,沒有新穎化。2.3.優點 框架美感,外觀吸引人,這一點便可以吸引到很多使用者。建議 實現的功能單一...
Untiy ShaderLab 隨手記錄
shader nafio tunlit subshader lod 150 pass struct v2f fixed4 frag v2f i sv target endcg maintex st 的說明,這個變數是後面transform tex需要用到 transform tex用於計算textu...
extjs 驗證隨手記錄
1.numberfield 設定不為小數的屬性 allownegative false 2.extjs驗證 vtype alpha,alphanum,email,url alpha只能輸入字母,無法輸入其他 如數字,特殊符號等 alphanum只能輸入字母和數字,無法輸入其他 email驗證,要求的...