第六章 指針變量的本質(zhì)是用來(lái)放地址,而一般的變量是放數(shù)值的。 1、int *p 中 *p和p的差別:簡(jiǎn)單說(shuō)*p是數(shù)值,p是地址! *p可以當(dāng)做變量來(lái)用;*的作用是取后面地址p里面的數(shù)值 p是當(dāng)作地址來(lái)使用。可以用在scanf函數(shù)中:scanf(“%d”,p);
2、*p++ 和 (*p)++的之間的差別:改錯(cuò)題目中很重要!考試超級(jí)重點(diǎn) *p++是 地址會(huì)變化。 口訣:取當(dāng)前值,然后再移動(dòng)地址! (*p)++ 是數(shù)值會(huì)要變化。 口訣:取當(dāng)前值,然后再使數(shù)值增加1。 例題:int *p,a[]={1,3,5,7,9}; p=a; 請(qǐng)問(wèn)*p++和(*p)++的數(shù)值分別為多少? *p++: 這個(gè)本身的數(shù)值為1。由于是地址會(huì)增加一,所以指針指向數(shù)值3了。 (*p)++ 這個(gè)本身的數(shù)值為1。由于有個(gè)++表示數(shù)值會(huì)增加,指針不移動(dòng),但數(shù)值1由于自加了一次變成了2。 3、二級(jí)指針: *p:一級(jí)指針:存放變量的地址。 **q:二級(jí)指針:存放一級(jí)指針的地址。 常考題目: int x=7; int*p=&x,**q=p; 問(wèn)你:*p為多少?*q為多少?**q為多少? 7 p 7 再問(wèn)你:**q=&x的寫法可以嗎? 不可以,因?yàn)槎?jí)指針只能存放一級(jí)指針的地址。 4、三名主義:(考試的重點(diǎn)) 數(shù)組名:表示第一個(gè)元素的地址。數(shù)組名不可以自加,他是地址常量名。(考了很多次) 函數(shù)名:表示該函數(shù)的入口地址。 字符串常量名:表示第一個(gè)字符的地址。 5、移動(dòng)指針(經(jīng)常加入到考試中其他題目綜合考試) char *s=“meikanshu” while(*s){printf(“%c”,*s);s++;} 這個(gè)s首先會(huì)指向第一個(gè)字母m然后通過(guò)循環(huán)會(huì)一次打印出一個(gè)字符,s++是地址移動(dòng),打印了一個(gè)字母后,就會(huì)移動(dòng)到下一個(gè)字母! 6、指針變量?jī)煞N初始化(一定要看懂) 方法一:int a=2,*p=&a;(定義的同時(shí)初始化) 方法二:int a=2,*p; (定義之后初始化) p=&a; 7、傳數(shù)值和傳地址(每年必考好多題目) void fun(int a,int b) void fun(int *a,int *b) { int t ; { int t ; t=a;a=b;b=t; t=*a;*a=*b;*b=t; } } main() main() { int x=1,y=3, { int x=1,y=3, fun(x,y); fun(&x,&y) printf(“%d,%d”,x,y); printf(“%d,%d”,x,y); } } 這個(gè)題目答案是1和3。 這個(gè)題目的答案就是3和1。 傳數(shù)值,fun是用變量接受,所以fun中 傳地址,fun用指針接受!這個(gè)時(shí)候fun 的交換不會(huì)影響到main中的x和y 。 中的交換,就會(huì)影響到main中的x和y。 傳數(shù)值,形參的變化不會(huì)影響實(shí)參。 傳地址形參的變化絕大多數(shù)會(huì)影響到實(shí)參!
8、函數(shù)返回值是地址,一定注意這個(gè)*號(hào)(上機(jī)考試重點(diǎn)) int *fun(int *a,int *b) 可以發(fā)現(xiàn)函數(shù)前面有個(gè)*,這個(gè)就說(shuō)明函數(shù)運(yùn)算結(jié)果是地址 { if(*a>*b)return a; return a 可以知道返回的是a地址。 else return b; } main() { int x=7,y=8,*max; max = fun(&x,&y); 由于fun(&x,&y)的運(yùn)算結(jié)果是地址,所以用max來(lái)接收。 printf(“%d,%d”,) } 9、考試重要的話語(yǔ): 指針變量是存放地址的。并且指向哪個(gè)就等價(jià)哪個(gè),所有出現(xiàn)*p的地方都可以用它等價(jià)的代替。例如:int a=2,*p=&a; *p=*p+2; (由于*p指向變量a,所以指向哪個(gè)就等價(jià)哪個(gè),這里*p等價(jià)于a,可以相當(dāng)于是a=a+2) 第七章 數(shù)組: 存放的類型是一致的。多個(gè)數(shù)組元素的地址是連續(xù)的。 1、一維數(shù)組的初始化: int a[5]={1,2,3,4,5}; 合法 int a[5]={1,2,3, }; 合法 int a[]={1,2,3,4,5}; 合法,??迹竺鏇Q定前面的大?。?/p> int a[5]={1,2,3,4,5,6}; 不合法,賦值的個(gè)數(shù)多余數(shù)組的個(gè)數(shù)了 2、一維數(shù)組的定義; int a[5];注意這個(gè)地方有一個(gè)重要考點(diǎn),定義時(shí)數(shù)組的個(gè)數(shù)不是變量一定是常量。 int a[5] 合法,最正常的數(shù)組 int a[1+1] 合法,個(gè)數(shù)是常量2,是個(gè)算術(shù)表達(dá)式 int a[1/2+4] 合法,同樣是算術(shù)表達(dá)式 int x=5,int a[x]; 不合法,因?yàn)閭€(gè)數(shù)是x,是個(gè)變量,非法的, define P 5 int a[P] 合法,define 后的的P是符號(hào)常量,只是長(zhǎng)得像變量 3、二維數(shù)組的初始化 int a[2][3]={1,2,3,4,5,6}; 合法,很標(biāo)準(zhǔn)的二維的賦值。 int a[2][3]={1,2,3,4,5, }; 合法,后面一個(gè)默認(rèn)為0。 int a[2][3]={{1,2,3,} {4,5,6}}; 合法,每行三個(gè)。 int a[2][3]={{1,2,}{3,4,5}}; 合法,第一行最后一個(gè)默認(rèn)為0。 int a[2][3]={1,2,3,4,5,6,7}; 不合法,賦值的個(gè)數(shù)多余數(shù)組的個(gè)數(shù)了。 int a[][3]={1,2,3,4,5,6}; 不合法,不可以缺省行的個(gè)數(shù)。 int a[2][]={1,2,3,4,5,6}; 合法,可以缺省列的個(gè)數(shù)。 補(bǔ)充: 1)一維數(shù)組的重要概念: 對(duì)a[10]這個(gè)數(shù)組的討論。 1、a表示數(shù)組名,是第一個(gè)元素的地址,也就是元素a[0]的地址。(等價(jià)于&a) 2、a是地址常量,所以只要出現(xiàn)a++,或者是a=a+2賦值的都是錯(cuò)誤的。 3、a是一維數(shù)組名,所以它是列指針,也就是說(shuō)a+1是跳一列?!?/p> 對(duì)a[3][3]的討論。 1、a表示數(shù)組名,是第一個(gè)元素的地址,也就是元素a[0][0]的地址。 2、a是地址常量,所以只要出現(xiàn)a++,或者是a=a+2賦值的都是錯(cuò)誤的。 3、a是二維數(shù)組名,所以它是行指針,也就是說(shuō)a+1是跳一行。 4、a[0]、a[1]、a[2]也都是地址常量,不可以對(duì)它進(jìn)行賦值操作,同時(shí)它們都是列指針,a[0]+1,a[1]+1,a[2]+1都是跳一列。 5、注意a和a[0] 、a[1]、a[2]是不同的,它們的基類型是不同的。前者是一行元素,后三者是一列元素。 2) 二維數(shù)組做題目的技巧: 如果有a[3][3]={1,2,3,4,5,6,7,8,9}這樣的題目。 步驟一:把他們寫成: 第一列 第二列 第三列 a[0]à 1 2 3 ->第一行 a[1]à 4 5 6 —>第二行 a[2]à 7 8 9 ->第三行 步驟二:這樣作題目間很簡(jiǎn)單: *(a[0]+1)我們就知道是第一行的第一個(gè)元素往后面跳一列,那么這里就是a[0][1]元素,所以是1。 *(a[1]+2)我們就知道是第二行的第一個(gè)元素往后面跳二列。那么這里就是a[1][2]元素,所以是6。 一定記?。褐灰嵌S數(shù)組的題目,一定是寫成如上的格式,再去做題目,這樣會(huì)比較簡(jiǎn)單。 3) 數(shù)組的初始化,一維和二維的,一維可以不寫,二維第二個(gè)一定要寫 int a[]={1,2} 合法。 int a[][4]={2,3,4}合法。 但int a[4][]={2,3,4}非法。 4) 二維數(shù)組中的行指針 int a[1][2]; 其中a現(xiàn)在就是一個(gè)行指針,a+1跳一行數(shù)組元素。 搭配(*)p[2]指針 a[0],a[1]現(xiàn)在就是一個(gè)列指針。a[0]+1 跳一個(gè)數(shù)組元素。搭配*p[2]指針數(shù)組使用 5) 還有記住脫衣服法則:超級(jí)無(wú)敵重要 a[2] 變成 *(a+2) a[2][3]變成 *(a+2)[3]再可以變成 *(*(a+2)+3) 這個(gè)思想很重要!
其它考試重點(diǎn) 文件的復(fù)習(xí)方法: 把上課時(shí)候講的文件這一章的題目要做一遍,一定要做,基本上考試的都會(huì)在練習(xí)當(dāng)中。 1)字符串的 strlen() 和 strcat() 和strcmp() 和strcpy()的使用方法一定要記住。他們的參數(shù)都是地址。其中strcat() 和strcmp()有兩個(gè)參數(shù)。
2)strlen 和 sizeof的區(qū)別也是考試的重點(diǎn);
3)define f(x)(x*x) 和 define f(x) x*x 之間的差別。一定要好好的注意這寫容易錯(cuò)的地方,替換的時(shí)候有括號(hào)和沒(méi)有括號(hào)是很大的區(qū)別。
4)int *p; p = (int *)malloc(4); p = (int *)malloc(sizeof(int));以上兩個(gè)等價(jià) 當(dāng)心填空題目,malloc的返回類型是 void *
6)函數(shù)的遞歸調(diào)用一定要記得有結(jié)束的條件,并且要會(huì)算簡(jiǎn)單的遞歸題目。要會(huì)作遞歸的題目
7)結(jié)構(gòu)體和共用體以及鏈表要掌握最簡(jiǎn)單的。typedef考的很多,而且一定要知道如何引用結(jié)構(gòu)體中的各個(gè)變量,鏈表中如何填加和刪除節(jié)點(diǎn),以及何如構(gòu)成一個(gè)簡(jiǎn)單的鏈表,一定記住鏈表中的節(jié)點(diǎn)是有兩個(gè)域,一個(gè)放數(shù)值,一個(gè)放指針。
8)函數(shù)指針的用法(*f)()記住一個(gè)例子: int add(int x, int y) {....} main() { int (*f)(); f=add; } 賦值之后:合法的調(diào)用形式為1、add(2,3); 2、f(2,3); 3、(*f)(2,3) 9)兩種重要的數(shù)組長(zhǎng)度: char a[]={‘a(chǎn)’,’b’,’c’}; 數(shù)組長(zhǎng)度為3,字符串長(zhǎng)度不定。sizeof(a)為3。 char a[5]={ ‘a(chǎn)’,’b’,’c’} 數(shù)組長(zhǎng)度為5,字符串長(zhǎng)度3。sizeof(a)為5。 10)scanf 和 gets的數(shù)據(jù): 如果輸入的是 good good study! 那么scanf(“%s”,a); 只會(huì)接收 good. 考點(diǎn):不可以接收空格。 gets(a); 會(huì)接收 good good study! 考點(diǎn):可以接收空格。 11)共用體的考查: union TT { int a; char ch[2];} 考點(diǎn)一: sizeof (struct TT) = 4; 12)“文件包含”的考查點(diǎn): no1.c no2.c #include”no2.c” main() { add(29 , 33); ……. } int add(int a,int b) { return a+b; }
這里一個(gè)C語(yǔ)言程序是有兩個(gè)文件組成,分別是no1.c, no2.c。那么no1.c中最開始有個(gè)#include”no2.c”他表示把第二個(gè)文件的內(nèi)容給包含過(guò)來(lái),那么no1.c中調(diào)用add()函數(shù)的時(shí)候就可以了把數(shù)值傳到no2.c中的被調(diào)用函數(shù)add()了。 一個(gè)文件必須要有main函數(shù)?!∵@句話錯(cuò)了?!±纾簄o2.c就沒(méi)有。 頭文件一定是以.h結(jié)束的。 這句話錯(cuò)了。例如:no1.c中就是#include”no2.c”以.c結(jié)尾的。 13)指針迷惑的考點(diǎn): char ch[]=”iamhandsome”; char *p=ch; 問(wèn)你 *(p+2) 和 *p+2的結(jié)果是多少? ‘m’ ‘k’ 結(jié)果是這兩個(gè),想不通的同學(xué)請(qǐng)作死的想!想通為止! 14)數(shù)組中放數(shù)組一定要看懂: int a[8]={1,2,3,4,4,3,2,2}; int b[5]={0}; b[a[3]]++ 這個(gè)寫法要看懂,結(jié)果要知道是什么?b[4]++,本身是0,運(yùn)行完后,b[4]為1了。 15)字符串的賦值 C語(yǔ)言中沒(méi)有字符串變量,所以用數(shù)組和指針存放字符串: 1、char ch[10]={“abcdefgh”}; 對(duì) 2、char ch[10]=“abcdefgh”; 對(duì) 3、char ch[10]={‘a(chǎn)’,’b’,’c’,’d’,’e’,’f’,’g’,’h’}; 對(duì) 4、char *p=“abcdefgh”; 對(duì) 5、char *p; 對(duì) p=“abcdefgh”; 6、char ch[10]; 錯(cuò)了!數(shù)組名不可以賦值! ch=“abcdefgh”; 7、char *p={“abcdefgh”}; 錯(cuò)了!不能夠出現(xiàn)大括號(hào)! 16)字符串賦值的函數(shù)背誦:一定要背誦,當(dāng)心筆試填空題目。 把s指針中的字符串復(fù)制到t指針中的方法 1、while( (*t=*s)!=null ){s++;t++;} 完整版本 2、while( *t=*s ){s++;t++;} 簡(jiǎn)單版本 3、while( *t++=*s++); 高級(jí)版本 17)typedef 是取別名,不會(huì)產(chǎn)生新的類型,他同時(shí)也是關(guān)鍵字 考點(diǎn)一:typedef int qq 那么 int x 就可以寫成 qq x 考點(diǎn)二:typedef int *qq 那么 int *x就可以寫成 qq x 18)static 考點(diǎn)是一定會(huì)考的!復(fù)習(xí)相關(guān)的習(xí)題。 static int x;默認(rèn)值為0。 int x:默認(rèn)值為不定值。 19)函數(shù)的遞歸調(diào)用一定會(huì)考!至少是2分。 |
|
來(lái)自: 昵稱29273511 > 《待分類》