作為一個(gè)Android開發(fā)者如果想閱讀源碼只會(huì)Java語言是不夠的仲智,由于工作的原因要求去了解源碼的一些邏輯尝丐,發(fā)現(xiàn)在看書和閱讀源碼的過程中不懂C語言真的寸步難行绰筛,只靠Java的那點(diǎn)基礎(chǔ)去理解C語言的語法很費(fèi)勁娇澎,所以在工作的間隙去學(xué)習(xí)C語言疲恢,目的不是能夠?qū)懗龆嗯5腃代碼凶朗,只是能夠看得懂別人的C代碼,知道每段代碼的意思显拳。下面從第二章開始記錄我讀《HeadFirst C》的筆記棚愤。
指針
指針即數(shù)據(jù)存放的地址值,指針變量接收的就是地址值
指針的使用方法:
&x 表示變量x的地址值
int* 是一個(gè)指針數(shù)據(jù)類型杂数,表示一個(gè)存放整型變量的地址值數(shù)據(jù)類型
*y 表示地址y上存放的數(shù)據(jù)
如下:
int x = 5;
int* m = &x; //m就是一個(gè)指針變量宛畦,接收x的地址值
x = *m; //獲取x地址值上存放的變量
注意:
1:指針的長度只和操作系統(tǒng)的位數(shù)有關(guān),32位的操作系統(tǒng)指針長度為4揍移,64位操作系統(tǒng)的指針長度為8
2:當(dāng)數(shù)組被當(dāng)做形式參數(shù)傳遞的時(shí)候次和,數(shù)組可以被用來當(dāng)做指針來處理,它指向數(shù)組的第一個(gè)地址位置
指針和數(shù)組的區(qū)別:
1:使用sizeof不同那伐,指針變量的長度只有4和8踏施,但是使用sizeof(數(shù)組),返回的是數(shù)組的長度
2:數(shù)組變量的地址就是它本身罕邀,指針變量的地址不是它本身畅形。如下:
char s[] = "How big is it"; //變量s是數(shù)組變量
char* t = s; //變量t是指針變量
其中&s==s ,但是 &t != t 诉探;
3:數(shù)組變量不能指向其他地方日熬。
創(chuàng)建指針變量的時(shí)候,計(jì)算機(jī)會(huì)為它分配4或8個(gè)字節(jié)的存儲(chǔ)空間阵具,但是創(chuàng)建數(shù)組的時(shí)候計(jì)算機(jī)不會(huì)為數(shù)組變量分配任何空間碍遍,編譯器僅在出現(xiàn)它的地方把它替換成數(shù)組的實(shí)際地址,所以不能把數(shù)組變量指向其他地方阳液。
上面的例子 s = t 怕敬,將t 賦值給 s 會(huì)報(bào)錯(cuò)
輸入
C語言中輸入主要用到兩個(gè)函數(shù)scanf
和fgets
scanf函數(shù)
1:使用方式:
char name[5];
printf("Enter your name:");
scanf("%4s",name);
printf("name: %s\n",name);
scanf接收一個(gè)char指針,上面的代碼要求總共會(huì)讀取4個(gè)字符帘皿,加上字符串結(jié)束符\0,一共5個(gè)所以字符數(shù)組的長度定義為5东跪,如果用戶輸入大于4個(gè)字符,也只會(huì)顯示4個(gè)字符
2:scanf的弊端:
使用這個(gè)函數(shù)的時(shí)候一定要嚴(yán)格限制用戶輸入的字符數(shù),一旦輸入的過多就會(huì)導(dǎo)致緩沖區(qū)溢出虽填,所以scanf的第一個(gè)參數(shù)我們一般會(huì)控制字符數(shù)而不是直接使用%s丁恭,但是并不是什么時(shí)候輸入的字符多了都會(huì)報(bào)錯(cuò)的,即使這樣我們也要控制
fgets 函數(shù)
1:使用方式:
fgets() 這個(gè)函數(shù)和scanf() 一樣也是接收char指針斋日,但是在使用它的時(shí)候你必須給出最大長度·牲览,fgets的返回值是char* 類型,是用戶輸入的字符串恶守。
char food[5];
printf("your food:");
fgets(food,sizeof(food),stdin); //sizeof設(shè)置了最大長度第献,stdin表示數(shù)據(jù)來自鍵盤
printf("you enter is %s\n",food);
2:使用注意:
這里food是一個(gè)數(shù)組所以可以使用sizeof來獲取長度,當(dāng)food是一個(gè)指針的時(shí)候就不能使用sizeof了兔港,因?yàn)橹羔樀拈L度是固定的庸毫,此時(shí)需要顯式的給出具體長度
fgets的長度已經(jīng)算上了結(jié)束符\0,所以上面的例子food中也只能接受4個(gè)字符
scanf函數(shù)和fgets 函數(shù)的區(qū)別
1:使用方式不同衫樊。都接收一個(gè)字符數(shù)組飒赃,但是scanf是手動(dòng)限制用戶輸入的字符個(gè)數(shù),fgets是通過參數(shù)的形式限制
//scanf的使用
char name[5];
printf("Enter your name:");
scanf("%4s",name); //在這里手動(dòng)限制用戶科侈,只能輸入4個(gè)字符载佳,因?yàn)橐还簿徒邮?個(gè)
printf("name: %s\n",name);
//fget的使用
char food[5];
printf("your food:");
fgets(food,sizeof(food),stdin); //在這里通過參數(shù)sizeof 來限制輸入的字符數(shù),也是只能輸入4個(gè)
printf("you enter is %s\n",food);
2:返回值不同兑徘。scanf 返回值是用戶輸入的數(shù)據(jù)條數(shù)刚盈,int類型;fgets 返回值是用戶每次輸入的數(shù)據(jù)挂脑,字符串類型
輸出
C語言中輸出到控制臺(tái)主要使用 puts 和 printf 函數(shù)
二者的區(qū)別:這兩個(gè)函數(shù)都是用來打印字符串的藕漱,區(qū)別是puts輸入完之后會(huì)自動(dòng)換行,printf不會(huì)自動(dòng)換行崭闲,需要手動(dòng)加上\n
C語言中的字符串
在C語言中是沒有字符串這個(gè)變量的肋联,C語言中字符數(shù)組就相當(dāng)于java中的字符串,使用流程如下:
1:導(dǎo)入C標(biāo)準(zhǔn)庫 <string.h>
2:對(duì)字符串的操作方法:
int strchr(char* original_str , char* target_str )
: 在字符串中查找字符刁俭,返回正表示找到橄仍,負(fù)數(shù)表示沒有
int strcmp(char* a,char* b)
: 比較字符串,比較字符串在字母表中的前后順序,返回int值牍戚。正:升序侮繁;負(fù):降序
strcpy()
: 復(fù)制字符串
strlen()
: 返回字符串的長度
strcat()
: 連接字符串
strerror(errno)
: 這個(gè)函數(shù)會(huì)顯示exec()函數(shù)運(yùn)行過程中出現(xiàn)的錯(cuò)誤