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