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