C語言實踐小結

1.在任何函數中,第一次出現的變量,都必須要先聲明他,例子如下:
調用函數中出現並聲明瞭int a,b,c;但是在主函數main中又第一次出現abc,這種情況也 要在主函數裏面聲明清楚abc inta,b,c;
2.return結尾一定好加“;”
3.如果函數調用的話,且在調用函數中出現循環結構,同時需要用到循環結果的話,則必須在循環體中用上return+XX,如果無需用到結果則不加,但在函數結束}前一定要有return。例如:
#include <stdio.h>
int sanjiaoxing(int a,int b,int c)
{
if (a+b<=c || a+c<=b || b+c<=a)
{
printf ("不能構成三角形\n");
return 0;
}
else
{
int critf=a+b+c;
return critf;
}
}
int main()
{
int a,b,c;
a=10;
b=10;
c=15;
printf("三角形周長是%d",sanjiaoxing(a,b,c));
return 0;
}


4.對於for循環中的if條件判斷句:
對於上述圖片如果滿足if條件判斷語句,則執行到return index 就跳出整個函數,因此這樣的代碼存在錯誤,會發生還沒有找到數字就提前跳出整個函數了,修改如下:
這樣子如果滿足if判斷語句執行if的循環,儘管沒有這個數字,還會進行for循環,直到for循環的表達式2不成立跳出循環。


5.數組作爲函數參數的注意項:
上述定義時候必須是arr []不可以漏了[]

6。
紅色標記不可以有,有的話執行錯誤
同樣說法如下:
紅色標記那裏不可以加【】如果加的話[]裏面有值

7.
for(i=0;i<10;i++)
{
all=0;
all=all+score[i];
}
printf("一共%d\n",all);
注意:在for循環裏面不可以賦初值,因爲for循環裏面是執行循環的代碼塊,如果在裏面賦值,那麼每次循環後all都會有一個樣的值,即0,故最後輸出的不是求和值而是最後一位數的值。


8.賦值和等號注意
9.浮點數實際上都是有符號數,因此signed unsigned不能加在float和double之前,當然不存在有符號數與無符號數之間轉化的問題。
10.C語言規定%只能用於int與char型變量,實際上char也屬於整型
11.強制性轉化錯誤寫法
(int)3*a 正確應爲(int)(3.*a)
12.要想顯示%,必須在格式控制符中使用%%來代替單個%
13.char ch=‘A’
printf("%c",ch) 顯示 A
printf("%d",ch) 顯示ASCII代碼
14.while((ch=getchar())!='\n')/*這裏=的優先級比!=要低,所以要用括號講ch=getchar()圍起來 這裏如果不加
\n的話,那麼將會是死循環,所以必須加*/
15.在有求解的表達式中,需要用到遞歸的,則必須把遞歸函數放進表達式中去。
16.多重循環嵌套,這種循環一定要注意每一個循環變量是否和前面的大循環變量是否有聯繫,如果有,那一定要將兩者聯繫起來
17.任何字符在編譯器中都是ASCII碼,所以直接賦值a爲‘A',那a+1的值則是B。
18.任何整型也可以用於儲存字符型數據
19.面對有EOF的循環,可以這樣處理跳出循環:ctrl+z(另起一行,按回車結束);或者ctrl+c,關閉窗口結束程序。
20.字符'0':char c = '0';   它的ASCII碼實際上是48。內存中存放表示:00110000
字符'\0' : ASCII碼爲0,表示一個字符串結束的標誌。這是轉義字符。
整數0 :ASCII碼爲0,字符表示爲空字符,NULL;數值表示爲0;內存中表示爲:00000000
21.製表符一般是8個空格
22. 通過二級指針調用指針數組(存字符串地址)時尤爲小心
對於: char *str[]={"kimcho","micho"};
char **strings=str;
printf(“%c”,**++strings);//實際上打出來的是m,也就是說,二級指針的地址訪問方法與二維數組類似,也是行存儲型,所以想要打出kimcho中的i,就必須先選定行,再在這個行裏面操作如:
printf(“%c”,*++(*strings))

23.const用法總結:
如果const與指針連用,當const用在指針前面時候也就是,char const *ch(表示,該指針指向的內容無法修改),如果當const用在指針後面時候也就是,char *const ch(表示,該指針的地址無法修改)

不嚴謹的講,左值右值的區分在於位於等號的那一側,左側的是左值,通常是一個變量,右側的是右值,可以是一個變量,或者是一個表達式。
表達式由一個或多個操作數通過操作符組合而成。最簡單的表達式僅包含一個字面值常量或變量。較複雜的表達式則由操作符以及一個或多個操作數構成。 例如:-i就是一個表達式

a和&a指向的是同一塊地址,但他們+1後的效果不同,a+1是一個元素的內存大小(增加4),而&a+1增加的是整個數組的內存
大小(增加40)。既a和&a的指向和&a[0]是相同的,但性質不同!

26.當一個指針指向NULL時,指針自身的地址爲0
當一個指針指向一個空字符串時,指針自身的地址不一定爲0

27.對於if(*point++ == *substr++)
這種判斷,每次程序執行到這一步時,裏面的判斷條件語句都會執行,不管判斷是否成立,也就是point的值都會+1,同理substr

28.break語句是跳出循環,對判斷語句無影響
29.scanf函數的返回值是正確按照格式輸入的參數的個數,如:scanf(“%c%c”,&a,&c),則該函數的返回值是2
30.
我們能常在用到 sizeof 和 strlen 的時候,通常是計算字符串數組的長度
看了上面的詳細解釋,發現兩者的使用還是有區別的,從這個例子可以看得很清楚:
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 計算字符串的長度,以結束符 0x00 爲字符串結束。
int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的數組 str[20] 所佔的內存空間的大小,不受裏面存儲的內容改變。
上面是對靜態數組處理的結果,如果是對指針,結果就不一樣了
char* ss = "0123456789";
sizeof(ss) 結果 4 ===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個指針的之所佔的空間,應該是長整型的,所以是4//?
sizeof(*ss) 結果 1 ===》*ss是第一個字符 其實就是獲得了字符串的第一位'0' 所佔的內存空間,是char類型的,佔了 1 位
strlen(ss)= 10 >>>> 如果要獲得這個字符串的長度,則一定要使用 strlen
sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因爲sizeof是個操作符不是個函數。
總結:
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
char* ss = "0123456789";
sizeof(ss) 結果 4 (注意指針和數組名在這裏的作用不一樣
31.對於二維數組,其數組名不可以直接賦值給一個指針變量,如果該指針變量爲航指針變量則可以直接賦值,對此,對二維數組的元素引用根據一般指針變量和行指針變量方法可以分爲:
A. 一般指針變量:
必須要用 *(p+i*n+j)//n表示列數,p爲指針
B.行指針變量:
可以用 p[ i ] [ j ]
*(*(p+i)+j)
32.對數組的大小的定義只能是常量表達式,不可是變量,例如:
int i=3; int arr[i];//這樣是錯誤的
33.NULL和NUL的區別:
NUL 是ASCII 字符集中 '\0' 字符的名字,它的字節模式爲全 0。NULL 指一個其值爲 0 的指針。它們都是整型值,其值也相同,所以它們可以互換使用。
0和'\0'的值都是0,但是'0'的值是48
34.printf函數輸出'\0'的形式是一個空格
35.int a[10];  a ,&a和&a[0] 都是分別是什麼?先說明a ,&a和&a[0]三個值是的相等哈
36.二進制數在計算機中是以補碼的形式存在的,對一個數進行求原碼,補碼,反碼,他們的符號位都不變,但是如果求的是按位取反,那麼符號位就要變
發佈了27 篇原創文章 · 獲贊 85 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章