C与指针、C陷阱与缺陷
遺留問題:
P15理解函數(shù)聲明
P39指針與數(shù)組
1、單/多字符符號—->貪心法
a+++++b?
【先了解a++與++a的實現(xiàn)原理】
//首先對于i++的實現(xiàn)是:(此時返回的是臨時對象)int temp; temp = i; i = i+1; return temp; //而++i的實現(xiàn)是: i = i+1; return i;含義:等價于((a++)++)+b,但是編譯失敗,因為((a++)++)+b中先執(zhí)行a++返回的結(jié)果不能作為左值,因此編譯失敗。
【總結(jié)】i++不能作為左值,++i可以作為左值
再例:
int main()
{
int d = 0,x = 0;
d = x+++2; //執(zhí)行結(jié)果等價于 d = x+2; x++;
x++ = 2; //編譯失敗,x++不能作為左值
++x = 2; //編譯成功,++x能作為左值
}
2、
單引號:引起來的一個字符實際上代表一個整數(shù)(整數(shù)值對應(yīng)于該字符在編譯器采用的字符集中的序列值)。
雙引號:引起來的字符串代表一個指向無名數(shù)組起始字符的指針。
3、
4、運算符的優(yōu)先級和結(jié)合性
【注】
自右向左的運算符:單目運算符、條件運算符?:、賦值運算符=
優(yōu)先級順序:單目、算數(shù)、移位、關(guān)系(比較)、位、邏輯、三目、賦值、逗號。
5、多寫分號
6、if-else配對問題
else始終與同一對括號內(nèi)最近的未匹配的if結(jié)合。
7、C語言允許初始化列表出現(xiàn)多余的逗號。例如:int days[] = {1,2,3,};
作用:據(jù)說初衷是為了方便自動代碼生成工具, 實際上可以說是一處設(shè)計失誤,代碼自動生成可以用啊。 你可以寫一個代碼,幫你自動生成源代碼。 這時候,就不用考慮各種格式問題,每一次輸出都是 “%d, “這種類型咯。
8、數(shù)組名a與&a
【注】一個數(shù)組只需要知道兩點:數(shù)組的大小,數(shù)組的首地址。
(三)多維數(shù)組指針的定義
9、malloc給數(shù)組分配多大的空間?
char *r = malloc(strlen(array)+1); //注:此處必須加1.
10、數(shù)組名做形參,則數(shù)組名會立刻被轉(zhuǎn)化為指向給數(shù)組第一個元素的指針。
也就是說,下面兩種寫法等價:
再例:
void str(int s[]) {cout<<sizeof(s)<<endl; // 4 因為數(shù)組名退化成指針cout<<s[0]<<endl; // 1,但是下標訪問[]還可以使用 } int main() { int array[12] = {1,2,3};str(array);return 0; } char st[] = "Hello";printf("%s",st); //打印Hello,因為printf中的數(shù)組名st做參數(shù),退化成指針。11、
//case 1: int i = 0; while(i < n)y[i] = x[i++]; //case 2: int i = 0; while(i < n)y[i++] = x[i]; //case 3: int i = 0; while(i < n) {y[i] = x[i];i++; } //case 4: for(int i = 0;i<n;i++ )y[i] = x[i]; /* case 1、2是錯誤寫法,不要這么寫!case 3、4正確! 【注】求值順序在作怪。 */ 12、整數(shù)溢出 對于加法運算,怎么進行溢出檢查,有下面兩種形式:INT_MAX是已定義的最大整數(shù)值。
//①
if((unsigned)a+(unsigned)b > INT_MAX)
complain();
//②
if(a > INT_MAX - b)
complain();
//讀入、處理、打印剩余的行
while(get(input)!=NULL)
{
printf(“%s”,input);
}
15、
char: 0~127
signed char: -127~127
unsigned char: 0~255
八進制: 0開頭
十六進制: 0x開頭
16、左移右移位運算符
對于unsigned值執(zhí)行所有的移位操作符都是邏輯移位(即:補0)。
17、宏定義中的空格
18、宏定義中用好括弧并不能保證“萬無一失”
例如:
#define max(a,b) ((a)>(b)?(a):(b)
c = ((a)>(b++)?(a):(b++));
//分析:此時b會被相加兩次,造成意想之外的結(jié)果,宏出現(xiàn)副作用。
【解決方案】—>用函數(shù)代替宏
【總結(jié)】在使用宏的時候,如果宏定義中同一個變量出現(xiàn)兩次,那么在使用宏時如果出現(xiàn)++或者–,就容易發(fā)生“副作用”,我們要避免這種情況的發(fā)生。
19、從用戶態(tài)切換到系統(tǒng)態(tài)的三個要素:
異常、中斷、系統(tǒng)(內(nèi)核函數(shù))調(diào)用
20、main函數(shù)正常退出返回0,異常退出返回-1.
21、gets( 字符數(shù)組名 ):把輸入設(shè)備中的一行字符串存儲到字符數(shù)組中
從“標準輸入”讀取“一行”文本并把它存儲在字符數(shù)組中。一行輸入由一串字符組成,以一個換行符結(jié)尾。gets函數(shù)丟棄換行符,并在該行的末尾存儲一個NUL字節(jié)(一個NUL字節(jié)是指字節(jié)模式為全0的字節(jié),類似與’\0’這樣的字符常量)。
返回非NULL表示讀取成功;
當讀入過程遇到EOF或發(fā)生錯誤時,返回NULL。
【拓展】
puts(string):把字符串string輸出到屏幕
puts()函數(shù)用來向“標準輸出設(shè)備(屏幕)”寫字符串并換行, 其調(diào)用格式為: puts(s);
puts(s) 等效于printf(“%s\n”,s),前提 :s是C風(fēng)格字符串,最后以’\0’結(jié)尾。
22、getchar()
int ch; //注意:char ch會出錯 while((ch = getchar())!=EOF)... ...23、間接運算符 ->和 . (用于訪問變量中指向的的內(nèi)容的值)
24、指針幾種常見的錯誤用法
25、如果傳遞的參數(shù)是數(shù)組名,并且在函數(shù)中使用下標引用[ ]該數(shù)組的參數(shù),那么在函數(shù)中對數(shù)組元素進行修改實際上修改的是調(diào)用程序中的數(shù)組元素。(函數(shù)將訪問調(diào)用程序的數(shù)組元素,數(shù)組不會被復(fù)制),這種行為相當于“傳址調(diào)用”。
26、一維數(shù)組名的含義
數(shù)組名:是指針常量,即數(shù)組第一個元素的地址&array[0],它不能被改變,不能被賦值。
總結(jié)
以上是生活随笔為你收集整理的C与指针、C陷阱与缺陷的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言框架总结
- 下一篇: 用CMake编译运行在网上下载的源文件s