原创 無符號數向有符號數自動轉化問題

1. 關於無符號數向有符號數自動轉化問題:

原创 關於修飾詞const

const在編程中經常遇到,包括全局變量和局部變量的修飾,函數參數的修飾,函數返回值的修飾等,下面我們來一步步的回顧下有關const關鍵詞的一些用意和疑問,並重新梳理一下const是何許人也? 1. const修飾的只讀變量必須在定義

原创 關於void和循環語句

關於void: 1. void的字面意思爲“空類型”,主要用於:對函數返回值的限定和對函數參數的限定; 2. 衆所周知,如果指針p1和p2的類型相同,那麼可以直接在p1和p2間相互賦值;如果p1和p2類型不同,則必須使用強制類型轉換把

原创 二級指針和野指針

1. 關於二級指針 例如:char **p; 這裏定義了一個二級指針變量p,p是一個指針變量,毫無疑問在32位系統下佔4個byte。 它與一級指針不同的是,一級指針保存的是數據的地址,二級指針保存的是一級指針的地址,佈局如下: 2.

原创 一邊走路一邊學習 關於struct和class的區別等幾個知識點總結

1. volatile作用: volatile是易變的、不穩定的意思。用它修飾的變量表示可以被某些編譯器未知的因素更改,比如:OS、hardware或者其他線程等;遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可

原创 關於強制轉換

1. a和&a的區別: &a是整個數組的首地址,a是數組首元素的首地址,其值相同,但是意義不同。 eg: char a[5] = {'A','B','C','D'}; char (*p1)[5] = &a; //沒有問題,char (*

原创 return str引出的內存分配方式---棧和堆的區別

請看這樣一段程序: char *fun(void) {     char str[50];     ....     return str; } 由於str屬於局部變量,位於堆棧中,在fun()函數結束時被釋放,返回str時出現錯誤。

原创 #define和typedef

#define是宏定義,關鍵詞:替換。如果定義的時候忘記了括號,或者沒有注意指針*,就會給程序帶來意想不到的錯誤;typedef是爲一個類型重新起一個名字,關鍵詞:rename.這兩者在實際當中存在哪些陷阱呢?常見的陷阱我就不再介紹了,

原创 看似簡單的if-else

條件語句if-else是在編程時最常見的語句,我們對它們是相當熟悉。本人上學時還鬧出一個笑話,可能是自己耳朵有問題或是老師教的有問題,一直把else讀爲:安賴死,以至於在做項目交流的時候,嘴巴冒出這個發音時,幾個哥們兒笑的人仰馬翻,不閒

原创 關於數組和指針

1. 先來看幾個例子,你能說出這幾個表示方法的意義和不同點嗎? a. int *p[10]  //10個指向int類型的指針,數組裏面的類型是int *,這個方式叫指針數組,可以轉化成二級指針; b. int (*p)[10]  //

原创 深藏不漏的註釋/**/ 和 //

我們先來看幾個帶有註釋的定義: a. int/****/i; b. char* s = "abcd   //hkdkd"; c. //Is a\ valid comment? d. in/****/t i; a,b,c,d哪些是正確

原创 道不盡的“指針”和“數組”

1. 一個基本的數據類型(包括結構體等自定義類型)加上“*”就構成了一個指針類型的 模子。這個模子的大小是一定的,與“*”前面的數據類型無關,“*”前面的數據類型 只是說明指針所指向的內存中存數的數據類型。所以在32位系統下,不管是什麼

原创 關於預處理#

1. 能用宏定義開始或者結束一段註釋嗎?例如:#define BSC // #define BMC /* #define EMC */那麼:BSD my single-line commentBMC my single-line co

原创 一個複雜宏定義的解讀

我們不提倡在寫代碼的時候出現太多複雜的宏定義,宏定義雖然可以簡化代碼量,但是讀起來非常費勁!下面來看一個例子:把一個buff中的數據拷貝到一個指定的數組中。由於種種原因,我們用宏定義來實現這些負責的轉化。 代碼如下: #inclu

原创 運算優先級等幾個小問題總結

1. '1'、"1"和1在32位系統中佔用空間大小一樣嗎? 答案:不一樣,1佔4個字節,'1'佔一個字節,"1"佔兩個字節,因爲字符串常量中,系統會在末尾自動加生一個'\0'。 -----------------------------