隨手記錄 之後整理

2021-06-20 16:50:56 字數 3544 閱讀 1874

關於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驗證,要求的...