版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
計算機二級課程
第1章程序設計基本概念
1.1程序和程序設計
1.1.1C程序
計算機語言:二進制
用戶:自然語言
自然語言9英文助記符、數學表達式(C語言)分二進制指令(目標文件*.obj)
9可執(zhí)行程序(*.exe)
C源程序(*.c)不能直接執(zhí)行,只能進行編輯
源程序轉換為目標文件的過程,叫做“編譯compile"
目標文件(*.obj)也不能直接執(zhí)行
目標文件轉換為可執(zhí)行程序的過程,叫做“連接link”
*.c---compile->*.obj---link->*.exe
1.1.2程序設計
1.2算法
算法:為解決某個問題而采用的確定且有限的步驟。
算法的特性:
1)有窮性:算法應該在有限的步驟內結束。
2)確定性:算法不能有二義性,對于相同的輸入能得到相同的輸出。
3)可行性:算法的步驟可以實現。
4)擁有足夠的情報:算法有0個或多個輸入;1個或多個輸出。
1.3結構化程序設計和模塊化結構
1.3.1結構化程序
C語言程序有3種基本結構:
順序結構
選擇結構(分支結構)
循環(huán)結構(重復結構)
1.3.2模塊化結構
自頂向下、逐步求精、模塊化
C語言使用“函數”實現模塊化。
C語言是函數的語言。
C程序的基本組成單位是函數。
第2章C程序設計的初步知識
2.1簡單C語言程序的構成和格式
#include<stdio.h>
main()
doublea,b,area;
a=1.2;/*將矩形的兩條邊分別賦給a和b*/
b=3.6;
r計算矩形的面積7
area=a*b;
,H
printf('a=%f,b=%f,area=%f\nJa,b,area);
)
說明:
1、main是主函數名。C語言程序必須使用main作為主函數名,其后需接一對圓括號()表
示其函數身份。main函數是C程序唯一的入口,也是程序唯一的出口,C程序從main函
數的第一條語句開始執(zhí)行。故,C程序有且僅有一個main函數。
2、C程序的語句以分號結尾。一般一條語句作為一行,但可以在一行上寫多條語句,也可
以將一條語句寫成多行。語句需寫在{}表示的函數體內。
3、在程序中可以使用I*……*/符號表示注釋,被注釋的部分將不會在程序執(zhí)行過程中
起作用,僅僅作為程序的說明。
inta=3,b=5;
a=10;I*賦值*/
b=20;
a+b的值是30
inta=3,b=5;
a=10;/*賦值b=20;
*1
a+b的值是_15
2.2標識符、常量和變量
2.2.1標識符
標識符包括:變量名、數組名、函數名。
1)由字母、數字、下劃線組成;
2)數字不能開頭;
3)不能和關鍵字重名。
int(整型)float(單精度實型)double(雙精度實型)char(字符
型)
sizeof(求字節(jié)數)short(短整型)long(長整型)
areaPIa_arrayx100_100x(正確)
a$ba++x.y100x(錯誤)
變量名可以叫做main、printf
標識符對大小寫敏感。
int(錯誤)
Int(正確)
2.2.2常量
常量:在程序執(zhí)行過程中,值不發(fā)生改變的量。
12-10(整型常量)
3.14-2.70.0(實型常量)
A'b'(字符型常量)
"NCRE”“Wuhan"(字符串常量)
2.2.3符號常量
習慣上,常量使用大寫字母表示,變量使用小寫字母表示,但不是必須的。
#defineN10
main()
(
N=N*2;/*不能對符號常量賦值*1
printf("%d\n",N);
)
main()
intn=10;
n=n*2;/*可以對變量賦值*/
printf("%d\n”,n);
}
#definePI3.14
main()
{
doubler,s;
r=5.0;
s=r*r*PI;
printf("s=%f\nH,s);
)
變量名可以叫做define、include
2.2.4變量
變量:在程序執(zhí)行過程中,值可以發(fā)生改變的量。
變量必須“先定義,后使用”
定義時,需指明變量的數據類型和變量名。
2.3整型數據
2.3.1整型常量
十進制:32767-327680
八進制:由“0”引導的整數。01001102340386(錯誤)
十六進制:由“Ox”或“0X”引導的整數。0x123Oxaa0x1ff
0~9a-10b-11...f-15
長整型常量:40000L40000I
無符號型常量:100U100u-12U(錯誤)
2.3.2整型變量
inta;
inta,b,c;
2.3.3整型數據的分類
long(int)4字節(jié)
int4字節(jié)
short(int)-32768~327672字節(jié)
signed有正有負
unsigned正整數
unsignedshort0~65535
2.3.4整型數據在內存中的存儲形式
位(bit):二進制位100110最小單位
字節(jié)(byte):1byte=8bit最基本單位
2.4實型數據
2.4.1實型常量
小數形式:0.123.1233.03.
在實數的整數部分或小數部分為0時,可將為0的部分省略,但小數點不可省。
0.00..0,(錯誤)
指數形式:3E2->3*102->3003.15e33.15e-1
E(e)的前面必須有數字,后面必須為整數。
E22e3e1.0(錯誤)
2.4.2實型變量
float(單精度實型)4字節(jié)
double(雙精度實型)8字節(jié)
2.5算術表達式
2.5.1基本的算術運算符
整數和整數運算,結果為整數
參與運算的數字中,有一個實數,結果結果就為實數
+-*
/注意:在什么情況下運算結果才有小數部分。
%求余數。求余數運算兩邊必須為整數。
絕對值相除得余數,符號取決于被除數。
main()
(
printf("%d\n",4%3);1
printf("%d\n",4%-3);1
printf("%d\n",-4%3);-1
printf("%d\n",-4%-3);-1
)
2.5.2運算符的優(yōu)先級、結合性和算術表達式
*/%
+-
2.5.3強制類型轉換表達式
(目標類型)需轉換變量
(int)bint(b)(錯誤)
2.6賦值表達式
2.6.1賦值運算符和賦值表達式
注意:
1)賦值運算的優(yōu)先級很低,往往需要在所有運算完成后,再進行賦值。
2)賦值運算理解上,從右向左進行。
3)賦值后,右側變量值不變,左側變量值更新。
4)賦值號左側只能是變量,不能是常量或表達式。
5)賦值表達式整體的值,等于被賦值變量的值。
main()
(
inta,b;
printf(',%d\n,,,(a=3)+(b=5));
}
2.6.2復合賦值表達式
a+=13a=a+1
a*=29a=a*2
a*=1+2今a=a*(1+2)
main()
inta=5;
a+=a-=a+a;
printf(,'%d\n'',a);
)
2.6.3賦值運算中的類型轉換
以被賦值變量的類型為準。
inta;
a=3.5;3
floata;
a=3;3.0
2.7自加、自減運算符和逗號運算符
2.7.1自加運算符”++”和自減運算符“一”
獨立構成語句時,i++和++i是等價的。
j=i++;-j=j;今先取值,后自增
i=i+1;
j=++i;9i=i+1;“先自增,后取值
j=i;
main()
inti=5;
printf("%d\n',,i++);5
printf("%d\nn,++i);7
)
2.7.2逗號運算符和逗號表達式
逗號運算符的優(yōu)先級最低;
從左至右運行每個表達式;
整個逗號表達式的值,等于最后一個表達式的值。
main()
(
inti,j,x;
x=(i=3,j=4);
printf("%d\n",x);4
)
main()
(
inti,j,x;
x=i=3,j=4;
printf("%d\n",x);3
)
第3章順序結構
3.1賦值語句
在賦值表達式后加上“:號,構成賦值語句
a=10賦值表達式
a=10;賦值語句
3.2數據輸出
3.2.1printf函數的一般調用形式
printf(l'a=%d\n",a);
1)非格式說明符部分原樣輸出。如:a=
2)轉義符進行轉義。\n換行
\t下一制表位
\b退格
\r回到開頭
3)格式說明符輸出變量值。
3.2.2printf函數中常用的格式說明
%d
%ld
%u
%o
%x
%f
%lf
%e
%g
3.2.3使用printf函數時的注意事項
3.3數據輸入
3.3.1scanf函數的一般調用形式
scanf中格式說明符的相關規(guī)則,和printf相同。
scanf中變量前需要加&號(取地址卜
scanf("%d",&a);
3.3.2scanf函數中常用的格式說明
3.3.3通過scanf函數從鍵盤輸入數據
scanf中非格式說明符部分,在輸入時應原樣輸入。
scanf("%d,%d",&a,&b);10,20
scanf("a=%d,%d",&a,&b);a=10,20
連續(xù)格式說明符,應使用空格、制表符、回車分隔數據。
scanf("%d%d",&a,&b);1020
按指定寬度輸入數據。
scanf("%2d%3d%d",&a,&b,&c);123456789
printf("%d,%d,%d\n",a,b,c);12,3,456
跳過某個輸入數據。格式說明符中*號,表示跳過此位置的輸入。
a=b=c=5;
scanf("%d%*d%d",&a,&b);123
printf("%d,%d,%d\n",a,b,c);1,3,5
3.4復合語句和空語句
3.4.1復合語句
在C語言中,可以使用{……}號將多條語句括起來,形成復合語句。
復合語句在邏輯上當做一條語句處理。
3.4.2空語句
;號是構成C語言語句的重要符號,若只有一個;號也能構成語句,它是一個空語句。
空語句本身不做任何操作,故一般不會影響程序結果,而不是完全不會影響程序結果。
第4章選擇結構
4.1關系運算和邏輯運算
4.1.1C語言的邏輯值
C語句中沒有邏輯類型。
在程序中使用0值表示假,使用非0值表示真。
main()
(
if(O)printf("yes\n");
elseprintf("no\n");
}
no
main()
{
if(-1)printf("yes\n");
elseprintf("no\n");
)
yes
在程序計算結果時,用0值表示假,用1表示真。
main()
printf(',%d\n,,,2<300);1
)
4.1.2關系運算符和關系表達式
><>=<===!=
C語言中不能正確表示連續(xù)的關系運算
main()
{
printf(',%d\n,,,4>3>2);0
)
><>=<=優(yōu)先級較高
==!=優(yōu)先級較低
main()
(
printf("%d\n",1==3>1);1
4.1.3邏輯運算符和邏輯表達式
&&邏輯與“且”兩邊同時為真,結果為真。
||邏輯或“或”兩邊有一邊為真,結果為真。
!邏輯非原來真,變?yōu)榧?。原來假,變?yōu)檎妗?/p>
main()
printf(',%d\nH,4>3&&3==2);0
printf(',%d\nH,4>3||3==2);1
pnntf("%d\nH,!(4>3));0
邏輯運算的中斷:
&&運算前段為假,后段不運行。
main()
{
intx=3,y=5;
(x=0)&&(y=8);
printf(“%d,%d\n“,x,y);0,5
)
II運算的前段為真,后段不運行。
main()
(
intx=O,y=O;
x++||y++;
printf("%d,%d\n",x,y);1,1
)
運算符的優(yōu)先級:
單目算術運算符關系運算符邏輯運算符賦值運算符逗號
運算符
!*/%+->>=<<===!=&&||=
!4>3&&2+5||7*31
4.2if語句和用if語句構成的選擇結構
4.2.1if語句
計算if的括號內表達式的值是否為真,若為真則運行if的子句
)
main()
(
intx;
scanf(n%dn,&x);
if(x%2==0)
printf("偶數\n");
)
注意:
1)if只能控制最近的一條語句。
main()
intx;
scanf("%d",&x);
if(x%2==0)
x++;
x++;
printf(n%d\nn,x);
)
2)若有多條語句作為if的子句,需用。構成復合語句。
main()
{
inta=3,b=6,t=0;
if(a==b)t=a;a=b;b=t;
,n
printf('%d,%d\nJa,b);6,0
)
3)在if的括號后不用加7號,否則會影響程序的邏輯。
main()
intx=8;
if(x==6);
x++;
printf("%d\nn,x);9
)
4)if的條件通常是一個關系表達式,但要注意其他情況,特別是賦值表達式冒充關系表達
式的情況。
main()
{
intx=8;
if(x=6)
x++;
printf("%d\n”,x);7
}
if-else
計算if的括號內表達式的值是否為真,若為真則運行if的子句,否則運行else的子句。
main()
intx;
scanf("%d",&x);
,,
if(x>0)printf(%d\n"Jx);
elseprintf(,'%d\n",-x);
)
注意:
1)else和最近的if配對
4.2.2嵌套的if語句
main()
{
inta=3,b=4,c=5;
if(a>3)
if(b==4)C++;
elsec-;
printf("%d\nu,c);5
main()
inta=3,b=4,c=5;
if(a>3)
(
if(b==4)C++;
}
elsec-;
printf("%d\nH,c);4
)
4.3條件表達式構成的選擇結構
條件表達式是C語言中唯一的三目運算。
exp1?exp2:exp3
先計算exp1是否為真,若為真取exp2,為假取exp3。
main()
printf("%d\n",5>3?4<7?1:10:100);1
)
4.4switch語句以及用switch語句和break語句構成的選擇結構
4.4.1switch語句
switch(a)
{
case1:n++;
case2:n++;
case3:n++;
case4:n++;
case5:n++;
)
語法規(guī)定:
1)switch后有一對小括號。
2)小括號中必須時整型或字符型表達式。
3)小括號后不能有“;”號。
4)case和數值間的空格不能省略。
5)case后需使用"號。
4.4.2switch語句的執(zhí)行過程
1)計算switch的括號內表達式的值。
2)判斷表達式的值和哪一個case相等,若找到了,則運行對應case后的語句。
3)若沒有找到,則運行default后的語句。
4)當某一個部分的語句運行后,會無條件的運行其后所有的語句,直到遇到break為止。
4.4.3在switch語句體中使用break語句
在結構中遇到break語句,立即終止結構。
main()
{
inta=O,n=O;
switch(a)
(
default:n++;
case1:n++;
case2:n++;
case3:n++;break;
case4:n++;
case5:n++;
}
printf("%d\n”,n);4
}
4.5語句標號和goto語句
4.5.1語句標號
4.5.2goto語句
第5章循環(huán)結構
5.1while語句和用while語句構成的循環(huán)結構
5.1.1while循環(huán)的一般形式
循環(huán)變量初始化
while(循環(huán)條件)
(
循環(huán)體
)
5.1.2while循環(huán)的執(zhí)行過程
1)循環(huán)變量初始化
2)判斷循環(huán)條件,若條件為真,則運行循環(huán)體。若條件為假,循環(huán)終止。
3)循環(huán)體運行完,返回到第2步,判斷條件。
1+2+3+.......+100
main()
intsum=0,i=1;
while(i<=100)
{sum=sum+i;
i++;
)
printf("%d\nn,sum);
}
1+2+3+......+50
main()
{
intsum=0,i=1;
while(i<=50)
{sum=sum+i;
i++;
)
printf("%d\n”,sum);
}
30+31+32+.......+50
main()
intsum=0,i=30;
while(i<=50)
{sum=sum+i;
i++;
)
pnntf("%d\nu,sum);
)
30+32+34+.......+50
main()
{
intsum=0,i=30;
while(i<=50)
{sum=sum+i;
i+=2;
)
printf("%d\n",sum);
)
1到100內,3和5的公倍數的和
main()
intsum=0,i=1;
while(i<=100)
if(i%3==0&&i%5==0)
sum=sum+i;
i++;
)
printf("%d\nn,sum);
}
12+22+32+......+102
main()
(
intsum=0,i=1;
while(i<=10)
(
sum=sum+i*i;
i++;
}
printf("%d\n",sum);
)
5.2do-while語句和用do-while語句構成的循環(huán)結構
5.2.1do-while語句構成的循環(huán)結構
循環(huán)變量初始化
do
{
循環(huán)體
}while(循環(huán)條件);
main()
{
intsum=0,i=1;
do
{
sum=sum+i;
i++;
}while(i<=100);
printf("%d\nH,sum);
)
5.2.2do-while循環(huán)的執(zhí)行過程
1)循環(huán)變量初始化
2)運行循環(huán)體
3)判斷循環(huán)條件,若條件為真,則返回第2步繼續(xù)循環(huán);若條件為假,則循環(huán)終止。
while循環(huán)和do-while循環(huán)的比較
1)語法區(qū)別:while的條件在循環(huán)體前,do-while的條件在循環(huán)體后,前面是do;while的
條件沒有":'號,do-while有。
2)邏輯區(qū)別:while先判斷條件,后執(zhí)行循環(huán)體;do-while先執(zhí)行循環(huán)體,后判斷條件。
當初始條件不滿足時,while一次也不運行循環(huán)體;而do-while至少運行一次。
5.3for語句和for語句構成的循環(huán)結構
5.3.1for語句構成的循環(huán)結構
for(循環(huán)變量初始化;循環(huán)條件;循環(huán)變量增量)
(
循環(huán)體
)
5.3.2for循環(huán)的執(zhí)行過程
1)循環(huán)變量初始化
2)判斷循環(huán)條件,若條件為真,則運行循環(huán)體;若條件為假,循環(huán)終止。
3)運行循環(huán)體
4)運行循環(huán)變量增量后,返回到第2步,判斷條件
1+3+5+.......+99
main()
{
intsum=O,i;
f0r(i=1;i<=99;i+=2)
sum+=i;
printf("%d\n",sum);
}
1-2+3-4+5-6+7.......+99-100
main()
(
intsum=0,i,s=1;
for(i=1;i<=100;i++)
{
sum+=s*i;
s=-s;
)
printf("%d\n",sum);
)
1+1/2+1/3+……+1/50
main()
(
doublesum=0;
inti;
for(i=1;i<=50;i++)
(
sum+=1.0/i;
)
printf("%f\n",sum);
)
5.3.3有關for語句的說明
1)for語句中的三個表達式都是可以省略的。
i=1;
for(;i<=100;i++)
{
sum+=i;
}
i=1;
for(;i<=100;)
sum+=i;
i++;
)
死循環(huán)-無法退出的循環(huán)
i=1;
for(;;)
(
if(!(i<=100))
break;
sum+=i;
i++;
)
5.4循環(huán)結構的嵌套
外層循環(huán)每循環(huán)一次,內層循環(huán)循環(huán)一輪;
內層循環(huán)循環(huán)結束,外層循環(huán)才循環(huán)一次。
main()
(
inti,j,cnt=O;
for(i=1;i<=4;i++)
for(j=1;j<=3;j++)
cnt++;
printf("%d\nH,cnt);
)
5.5break和continue語句在循環(huán)體中的作用
5.5.1break語句
立刻終止循環(huán)結構
main()
(
inti,sum=0;
for(i=1;i<=10;i++)
{
if(i==5)
break;
sum+=i;
}
printf("%d\n,,,sum);10
)
5.5.2continue語句
結束(跳過)本次循環(huán)后面的語句,繼續(xù)一下次循環(huán)。
main()
inti,sum=O;
for(i=1;i<=10;i++)
(
if(i==5||i==7)
continue;
sum+=i;
}
printf(',%d\n,,,sum);43
)
第6章字符型數據
6.1字符型常量
6.1.1字符常量
'A'b'#''\n'
C語言中所有的字符,以ASCII碼存放。
'A'-65
'a'"97
'O'-48
注意:
1)有多種字符常量:$,
2)單引號內只能是一個字符'ab'(錯誤)
6.1.2轉義符常量
'\n'換行
'\t'制表符
'\b'退格
'\r'返回
'\\'\
'V,
'\ddd'由1~3位八進制數表示的ASCII碼值所對應的字符'\101'-'A'
'\108'(錯誤)
'\xhh'由1~2位十六進制數表示的ASCII碼值所對應的字符‘\x65'-'e'
6.1.3字符串常量
“abc”串長=3
“a\bc”3
“abc123”6
uabc\123"4
空串0
6.1.4可對字符常量進行的運算
C語言中字符就是一個整數,所以可以對其進行運算。
對字符型進行的運算,就是對其ASCII碼值進行的運算。
大寫字母+32〉所對應的小寫字母
小寫字母-32f所對應的大寫字母
6.2字符變量
charc1;
charc1='A';
6.3字符的輸入和輸出
6.3.1調用printf和scanf函數輸出和輸入字符
%c字符型的格式說明符
注意:
main()
(
charc1,c2;
scanf("%c%c",&c1,&c2);
printf("%c,%c\n",c1,c2);
)
在scanf中使用連續(xù)的%c%c輸入字符型數據時,不能使用任何方式分割字符,必須連續(xù)輸
入。
否則,用來分割的符號會作為有效輸入賦給變量。
main()
{
charc1,c2;
scanf("%2c%2c",&c1,&c2);
printf("%c,%c\n",c1,c2);
)
指定寬度輸入時,只會將第一個字符賦給變量。
main()
{
inta,b;
charc;
scanf("%d%c%d,',&a,&c,&b);10A20
printf(“%d,%c,%d\n”,a,c,b);10,A,20
}
6.3.2調用putchar和getchar函數輸出和輸入字符
main()
{
charc='a';
c=getchar();
putchar(c);
)
第7章函數
7.1庫函數
庫函數系統(tǒng)已經定義好的函數,直接調用即可。
庫函數的使用方法:
1)獨立構成語句。printf("%d”,x);
2)作為表達式的一部分。n=pow(2,2)+abs(-5)+sqrt(4);
stdio.hprintf()scanf()putchar()getchar()
math.hpow(2,3)-8
abs(-3)?3fabs(-3.5)-3.5
sqrt(9)-3
7.2函數的定義和返回值
和其他的程序元素一樣,函數也必須先定義,后使用。
7.2.1函數定義的語法
intfun(inta,intb)
returna+b;
)
函數定義一般形式:
函數類型函數名(參數類型參數名,參數類型參數名.....)
(
函數體
)
注意:
1)函數類型應和函數返回值的類型一致。當不一致時,按照賦值原則,以函數類型為準。
若函數無返回值,則應將函數定義為void類型(空類型b當定義函數時,未聲明函數類型,
則函數的默認類型為into
2)函數名需符合標識符命名規(guī)則。
3)定義函數時所列出的參數叫‘形式參數”(形參卜每個形參均需分別聲明類型。形參的個
數任意,若形參個數為0時,稱函數為無參函數。
4)函數不能嵌套定義,即,不能在一個函數里面定義新的函數。
5)函數需先定義,后使用。即,定義部分需放在調用部分的前面。若函數類型為int時,
定義放在調用后也可(不推薦b
7.2.2函數的返回值
函數通過return語句返回值。
returna+b;或return(a+b);
函數運行到return時,會將return后表達式的值作為函數值返回,同時立刻終止掉函數的
運行,返回到函數被調用的位置。
若函數中無return,則當最后一條語句運行完時終止。
7.3函數的調用
7.3.1函數的兩種調用方式
1)獨立構成語句。printf("%d",x);
2)作為表達式的一部分。n=pow(2,2)+abs(-5)+sqrt(4);
7.3.2函數調用時的語法要求
1)函數名必須與定義的函數名一致。
2)調用函數時出現的參數叫“實際參數”(實參卜實參一般一個確定的常量、變量或表達式。
實參不需要聲明類型。
3)實參必須與形參完全匹配。個數、類型、順序。若實參類型與形參類型不一致時,按賦
值原則,以形參類型為準。
4)調用時,實參值單向傳遞給形參。
7.4函數的聲明
7.4.1函數聲明的形式
函數首部;
函數聲明中需指出以下內容:函數類型、函數名、參數類型。
doublefun(intjnt);正確形參名不是函數聲明時的必要內容。
7.4.2函數聲明的位置
前面:所有代碼的前面;main函數的前面。
函數聲明可以出現在某個函數的內部。
7.5調用函數和被調用函數之間的數據傳遞
函數的參數傳遞是單向的,只能有實參傳遞給形參,形參的改變是不能影響實參的。
第8章地址和指針
8.1變量的地址和指針
地址:變量在內存中的編號。
指針:用來存放地址的變量。
地址?今指針
8.2指針變量的定義和指針變量的基類型
inta;
int*p;
注意:*號的作用在C語言中有3種:
乘法;
當*出現在定義語句中時,表示后面的變量是個指針;
*以單目運算符形式出現普通語句中時,表示取值(取出指針所指變量的值卜
p=&a若有針對指針的賦值,理解上應從左向右進行,理解為:令p指向a。
在P指向a的前提下,程序產生兩組等價關系。
p3&a
*p<-玲a
*p=&a;錯誤
int*p=&a;正確
main()
{
inta=5,*p=&a;
a=10;
*p=20;
printf(”%d,%d\n“a*p);2020
}
8.3給指針變量賦值
8.3.1給指針變量賦地址值
1)令指針直接指向變量
inta,*p;
p=&a;
2)通過其他指針確定指向
inta,*p=&a,*q;
q=p;
main()
inta=5,*p=&a,*q;
q=p;
a=10;
*p=20;
*q=30;
printf("%d,%d,%d\n",a,*p,*q);30,30,30
)
8.3.2給指針變量賦“空”值
在stdio.h中定義了符號常量NULL—0EOF--1
NULL0'\0'
int*p;
p=NULL;令指針p指向空
空地址是系統(tǒng)的保留地址,即,不可向空地址中賦值。
int*p=NULL;
*p=10;錯誤。不能對指向空地址的指針賦值。
int*p;
*p=10;錯誤。不能對未確定指向的指針賦值
inta,*p=&a;
*p=10;正確
8.4對指針變量的操作
8.4.1通過指針來引用一個存儲單元
在指針前加*號即可。
*和&互為逆運算
二級指針(指向指針的指針)
main()
{
inta=5,*p=&a,**q;
q=&P;
printf("%d,%d,%d\n",a,*p,**q);5,5,5
)
8.4.2移動指針
指針移動僅發(fā)生在指針指向數組時。此時,令指針自增,表示將指針向后移動;自減,表示
向前移動。
main()
(
inta[5]={10,20,30,40,50},*p=&a[2];
P++;
printf(',%d\n,,,*p);40
)
是否移動,主要看指針是否又被重新賦值。
p++p=p+1
加幾,表示后移幾個位置;減幾,表示前移幾個位置。
main()
inta[5]={10,20,30,40,50},*p=&a[2];
printf(',%d\n,',*p++);先取p和*號結合,取值30,后移動p
printf("%d\nH,(*p)++);先取*p,40,后累加*p值為41
printf("%d\n",*++p);先后移p,后取*p值,50
printf("%d\n",++*p);先累加*p值,后取值,51
)
8.4.3指針比較
僅當指針指向同一數組時,才有比較的意義。
main()
{
inta[5]={10J20J30,40,50},*p=&a[1],*q=&a[3];
printf("%d\n”,q?p);2
)
指針相減,減的是所指的數組下標。
8.5函數之間地址值的傳遞
8.5.1形參為指針變量時實參和形參之間的傳遞
函數參數傳遞是單向的,只能由實參傳遞給形參,形參的改變是無法影響實參的,但指針除
外。
fun(inta,int*b)
(
a=a+*b;
*b=a+*b;
)
main()
(
inta=10,b=20;
fun(a,&b);
printf(n%d,%d\nn,a,b);10,50
)
8.5.2通過傳送地址值在被調用函數中直接改變調用函數中的變量的值
8.5.3函數返回地址值
int*fun(int*a,int*b)
if(*a>*b)returna;
elsereturnb;
}
main()
(
inta=10,b=20;
int*c;
c=fun(&a,&b);
printf(n%d\nn,*c);20
)
第9章數組
9.1一維數組的定義和一維數組元素的引用
9.1.1一維數組的定義
inta[10];
說明:
1)這里定義的是一個由10個int型元素組成的一維數組ao
2)定義時方括號中的整型常量表達式表示數組中元素的個數。定義數組時須指明長度,且
長度表達式不能由實型或變量組成。
3)數組元素的下標從0開始,故長度為5的數組,下標最大只能到4。
inta[10];正確
inta[5+5];正確
intn=10,a[n];錯誤
intn[5.0]錯誤
#defineN10
inta[N];正確
inta[];錯誤
9.1.2一維數組元素的引用
求和:
inti,sum=O;
for(i=0;i<=9;i++)
sum+=a[i];
求平均值:
inti,sum=O;doubleave;
for(i=0;i<=9;i++)
sum+=a[i];
ave=sum/10.0;
求最值:
inti,max;
max=a[O];
for(i=0;i<=9;i++)
if(max<a[i])
max=a[i];
轉置:
int
for(i=0,j=9;i<j;i++,j-)
(
t=a[i];a[i]=aQ];a[j]=t;
)
排序:
排序使用3個變量完成,外層循環(huán)i從第1個開始到倒數第2個為止,內層循環(huán)j從i的下
一個開始到最后為止,循環(huán)體內比較的關系(重復后一個字,從小到大),交換a[i]a[j]
inti,j,t;
for(i=0;i<=8;i++)
for(j=i+1;j<=9;j++)
if(a[i]<a[j])
t=a[i];a[i]=aO];a[j]=t;
)
9.1.3一維數組的初始化
intb[5]={10,20,30,40,50};標準方式:初始化個數和數組長度相同
intb[5]={10,20,30,40,50,60};錯誤
intb[5]={10,20,30);定義數組時若只給部分元素賦初值,則未被賦初值的元素
將自動賦。值。
intb[]={10,20,30);定義數組時若同時對數組進行初始化,則可以省略數組的
長度,
此時,數組長度等于初始化的個數。
9.1.4通過賦初值定義數組的大小
9.2一維數組和指針
數組名代表數組的首地址常量。首地址(首個元素的地址卜
inta[5],*p;
p=a;
p=&a[0];
程序中所有出現a的地址都能被p替換。
printf("%d\n",*p++);
printf("%d\n",*++p);
printf("%d\n",++*p);
printf("%d\n",(*p)++);
printf("%d\n",*p);
數組元素的多種表示方法:
a[i]p[i]*(P+i)*(a+i)
p++;對
a++;錯
指針指向數組中段,下標從0開始重新計數。
inta[5]={10,20,30,40,50);
int*p;
P=&a[2];
printf("%d\n",p[-1]);20
9.3函數之間對一維數組和數組元素的引用
9.3.1數組元素作實參
和普遍變量一樣
9.3.2數組名作實參
數組名作為實參,則形參有以下表達方式:
1)使用和實參一樣的數組定義。inta[N]
2)使用不指明長度的數組定義。inta[]
3)使用指針表示。int*a
9.3.3數組元素地址作為實參
9.3.4函數的指針形參和函數體中數組的區(qū)別
9.4一維數組應用舉例
9.5二維數組的定義和二維數組元素的引用
9.5.1二維數組的定義
inta[2][3];
9.5.2二維數組元素的引用
9.5.3二維數組的初始化
inta[2][3]={{1,2,3},{4,5,6});
inta[2][3]={{1,2},{4}};
inta[2][3]={1,2.4);
inta口[3]={{1,2,3},{4,5,6}};
inta[2][]={{1,2,3},{4,5,6});錯誤
主對角線置0:
for(i=0;i<=3;i++)
a[i][i]=O;
左下三角置0:
for(i=0;i<=3;i++)
for(j=0;j<=i;j++)
a[i]D]=O;
右上三角置0:
for(i=0;i<=3;i++)
for(j=i;j<=3;j++)
a[i]0]=O;
反對角線置0:
for(i=0;i<N;i++)
a[i][N-1-i]=0;
左上三角置0:
for(i=0;i<N;i++)
for(j=0;j<=N-1-i;j++)
a[i]0]=O;
右下三角置0:
for(i=0;i<N;i++)
for(j=N-1-i;j<N;j++)
a[i]0]=O;
轉置:
for(i=0;i<N;i++)
forG=0;j<=i;j++)
(
t=a[i]O];a[i]O]=aO][i];a皿i]=t;
}
9.6二維數組和指針
二維數組的一維表示:
inta[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16));
int*p=a;
printf("%d",p[5]);6
二維數組元素的多種表示方法:
*(a[i]+j)*(*(a+i)+j)(*(a+i))[j]*(&a[0][0]+i*N+j)
指向數組的指針:
inta[2][3]={{1,2,3},{5,6,7});
int(*p)[3];
P=a;
由指針構成的數組:
inta[2][3]={{1,2,3},{5,6.7});
int*p[2];
p[O]=a[O];
p[1]=a[1];
int*p;
int**p;
int(*p)[M];
int*p[N];
9.7二維數組和指針數組作為實參
inta[N]
inta[]
int*a
二維數組作為形參的多種表示:
inta[N][M]
inta[][M]
int**a;
int(*a)[M]
第10章字符串
10.1用一維字符數組存放字符串
程序會自動在字符串常量的末尾添加(看不見的八0'—字符串的結束符
chars[]={Habcn);
printf("%d\nH,sizeof(s));
'\0'0NULL
10.1.1通過賦初值的方式給一維字符數組賦字符串
chars1[尸{七be”};
chars2[]={'a','b?c?\0'};
10.1.2在C程序執(zhí)行過程中給一維字符數組賦字符串
charsO^aVb'/c^O'};
chars|]={"abc"};
charsO=,,abc";
chars[4]="abc";
char*p=,'abcn;
char*p;p=Habcn;
錯誤情況:
charsQ={'a','b','c');
chars[3]="abc";
chars[4];s="abc";
10.2使指針指向一個字符串
10.2.1通過賦初值的方式使指針指向一個字符串
10.2.2通過賦值運算使指針指向一個字符串
10.2.3用字符數組作為字符串和用指針指向的字符串之間的區(qū)別
10.3字符串的輸入和輸出
10.3.1輸入和輸出字符串時的必要條件
10.3.2用格式說明符%s進行整串輸入和輸出
%d%o%x%f%c
%s表示從當前所指的位置開始輸出,直到遇到結束符為止。
main()
(
chars[]="abcdef;
char*p=s;
printf("%s\n",p+2);cdef
)
使用%5輸入字符串時,遇到空格將停止輸入。
chars1[20],*p=s1;
scanf("%s",p);
chars1[20],*p;
scanf(n%sn,p);不能對未確定指向的指針賦值
10.3.3調用gets、puts函數在終端輸入或輸出一行字符串
gets(s)能夠接受空格的輸入
main()
(
chars[20];
gets(s);
puts(s);
)
10.4字符串數組
10.5用于字符串處理的函數
strlen(s)求字符串長度,從當前所指的位置開始統(tǒng)計,直到遇到結束符為止。
chars[20]="abcde";
printf("%d\n",strlen(s));5
printf("%d\n",sizeof(s));20
chars[]="abcde";
printf("%d\n",strlen(s));5
printf("%d\n",sizeof(s));6
strcpy(s1,s2)將后一個字符串的內容復制到前一個字符串中。
strcat(s1,s2)將后一個字符串連接到前一個字符串的后面
strcmp(s1,s2)比較兩個字符串的大小,前面大返回正數
相等返回0
后面大返回負數
第11章對函數的進一步討論
11.1傳給main函數的參數
main(intargc.char*argv[])
其中:
argc表示執(zhí)行程序時命令行參數的個數。
argv口中存放的是各命令行參數的首地址。
main(intargc.char*argv[])
while(argc>1)
argc-;
printf(H%s",argv[argc]);
)
)
11.2通過實參向函數傳遞函數名或指向函數的指針變量
int(*f)();指向函數的指針
intadd(inta,intb)
{
returna+b;
)
main()
(
int(*f)(int,int);//定義指向具有2個整型參數且返回值為整型的指針f
f=add;//令指針f指向函數add
printf("%d\n",(*f)(3,5));〃通過指針f調用函數addf(3,5)
)
int(*f)(int,int);指向函數的指針
int*f(inta,intb);返回值為指針的函數
11.3函數的遞歸調用
遞歸:
直接遞歸-函數自己調用自己
間接遞歸-函數通過其他函數調用自己。
斐波那契數列
1123581321
intf(intn)
(
if(n>2)returnf(n-1)+f(n-2);
elsereturn1;
)
main()
(
printf("%d\n",f(5));
)
intf(intn)
if(n>1)returnn*f(n-1);
elsereturn1;
)
第12章C語言中用戶標識符的作用域和存儲類型
12.1局部變量、全局變量和存儲分類
12.1.1用戶標識符的作用域
局部變量和全局變量重名時,全局變量被屏蔽,局部變量發(fā)揮作用。
inta=50;
voidfun()
{
printf("%d\nH,a);
)
main()
{
a++;
{
inta=100;
printf("%d\n”,a);
)
fun();
printf("%d\n",a);
)
12.1.2局部變量、全局變量和存儲分類
12.2局部變量及其作用域和生存期
局部變量的生命周期較短,在函數調用完時,局部變量被釋放。
register寄存器型register型變量不能進行&運算
auto自動型默認類型不賦初值,初值為隨機值不能保留上一次的運行
結果
static靜態(tài)型不賦初值,初值為0保留上次的運行結果
extern外部型
voidfun()
staticinta=1;
a++;
printf("%d\n",a);
)
main()
fun();2
fun();3
)
inta=100;
voidfun()
(
externinta;
printf("%d\nH,a);
)
main()
(
fun();100
)
12.2.1auto變量
12.2.2register變量
12.2.3靜態(tài)存儲類型的局部變量
12.3全部變量及其作用和生存期
在默認情況下,全局變量的特性類似于static的局部變量
全局的static:此變量不能被外部引用。
extern:引用外部的變量。
Filel.c
staticinta=10;
fun1()
(
printf("%d\nH,a);
}
File2.c
fun2()
(
externinta;
printf("%d\nM,a);
)
12.3.1全局變量的作用域和生存期
12.3.2在同一編譯單位內用extern說明符擴展全局變量的作用域
12.3.3在不同編譯單位內用extern說明符擴展全局變量的作用域
12.3.4靜態(tài)全局變量
12.4函數的存儲分類
12.4.1用extern說明函數
12.4.2用static說明函數
第13章編譯預處理和動態(tài)存儲分配
13.1編譯預處理
13.1.1宏替換
先替換,后計算
#defineN5+5
#defineMN/N
main()
(
printf("%d\n",2*M);16
)
#defineN(x,y)x*y
main()
(
printf("%d\n",N(2+3,2));8
)
13.1.2文件包含
1)預處理命令包括:#define#include。預處理今預先處理,預先是相對于編譯,即,
預處理命令在編譯前執(zhí)行。
2)預處理命令后沒有";’號,故不屬于C語句。
3)預處理命令#include后可以聲明包含任意類型的文件,一般文件擴展名為*.h,但不一
定。
4)當預處理命令中,所包含文件出錯時,整個程序需要重新編譯。
13.2動態(tài)存儲分配
13.2.1malloc函數和free函數
int*p;
p=(int*)malloc(sizeof(int));分配int型所占字節(jié)數的空間返回空間的地址。
free(p);釋放p所指空間的內容。
13.2.2calloc函數
分配n個連續(xù)空間。
main()
(
int*p;
p=(int*)calloc(5,sizeof(int));
p[0]=10;
p[1]=p[0]*2;
printf("%d\n",p[1]);20
第14章結構體、共用體和用戶定義類型
14.1用typedef說明一種新類型名
用來定義新的類型名
typedef舊類型名新類型名;
typedefint*INT;
14.2結構體類型
多種數據類型的集合。
14.2.1結構體類型的說明
structST定義結構體類型
doublea;
intb;
structSTx;通過結構體類型,定義結構體變量
structST在定義結構體類型的同時,定義結構體變量
double
intb;
)x;
struct定義匿名的結構體類型,同時定義變量。
doublea;
intb;
)X;
typedefstructST結構體類型名
doublea;
intb;
}A;結構體的新類型名
Ax;
14.2.2結構體類型的變量、數組和指針變量的定義
typedefstructST
(
inta,b;
)A;
Ax={1,2};通過新類型名定義結構體變量
A*p;定義結構體指針
p=&x;令指針p指向結構體變量x
當結構體變量為“值”時使用“.”訪
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年版礦產資源探礦權出讓合同范本(含礦產資源勘查風險分擔)3篇
- 2025年度內蒙古草原生態(tài)旅游承包經營合同3篇
- 2025年度音樂教育項目藝人授課合同3篇
- 二零二五年度文化旅游綜合體租賃合同書3篇
- 年度單抗導向藥物戰(zhàn)略市場規(guī)劃報告
- 二零二五年度東易日盛跑路事件客戶賠償與調解合同3篇
- 2024瑜伽館瑜伽教練勞動合同范本及教練與學員溝通規(guī)范3篇
- 二零二五版“520”荔枝電商法治講堂講師聘用合同3篇
- 2024版建筑水電分包合同范本
- 二零二五年度房產評估咨詢合同樣本4篇
- 人教版八年級下冊第一單元英語Unit1 單元設計
- PEP小學六年級英語上冊選詞填空專題訓練
- 古建筑修繕項目施工規(guī)程(試行)
- GA 844-2018防砸透明材料
- 化學元素周期表記憶與讀音 元素周期表口訣順口溜
- 非人力資源經理的人力資源管理培訓(新版)課件
- MSDS物質安全技術資料-201膠水
- 鉬氧化物還原過程中的物相轉變規(guī)律及其動力學機理研究
- (完整word)2019注冊消防工程師繼續(xù)教育三科試習題及答案
- 《調試件現場管理制度》
- 社區(qū)治理現代化課件
評論
0/150
提交評論