文章目錄??上一篇??C語言詳細(xì)知識點(diǎn)(上)
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括東方網(wǎng)站建設(shè)、東方網(wǎng)站制作、東方網(wǎng)頁制作以及東方網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,東方網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到東方省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
(1)數(shù)組是一組有序
數(shù)據(jù)的集合
(2)用一個(gè)數(shù)組名
和下標(biāo)
來唯一地確定數(shù)組中的元素
(3)數(shù)組中的每一個(gè)元素都屬于同一個(gè)數(shù)據(jù)類型
(1)數(shù)組聲明
語法:
類型 數(shù)組名[常量表達(dá)式];
注意:
1)類型是任意合法的類型
2)數(shù)組名遵循標(biāo)識符命名規(guī)則
3)定義數(shù)組時(shí),需要制定數(shù)組中元素的個(gè)數(shù),int a[10],不存在a[10]
4)常量表達(dá)式可以包括常量和符號常量
,不能包含變量
(2)數(shù)組引用
語法:
數(shù)組名[下標(biāo)];
注意:
1)只能引用數(shù)組元素而不能一次整體調(diào)用整個(gè)數(shù)組全部元素的值
2)定義數(shù)組時(shí)用到的數(shù)組名[常量表達(dá)式]
和引用數(shù)組元素時(shí)用的數(shù)組名[下標(biāo)]
形式相同,但含義不同
如:int a[10]; //前面有int,這是定義數(shù)組,指定數(shù)組中包含10個(gè)元素
t=a[6]; //這里表示引用數(shù)組中序號為6的元素
例1、對10個(gè)數(shù)組元素依次賦值為0,1,2,3,4,5,6,7,8,9
,要求逆序輸出
#includevoid main()
{int a[10],i;
for(i=0;i<10;i++){a[i]=i;
}
for(i=9;i>=0;i--){printf("%d\t",a[i]);
}
}
(3)數(shù)組初始化
1)在定義數(shù)組時(shí)對全部數(shù)組元素賦予初值
如:int a[10]={0,1,2,3,4,5,6,7,8,9};
2)可以只給數(shù)組中的一部分元素賦初值
如:int a[10]={0,1,2,3,4};
3)如果想使一個(gè)數(shù)組中全部元素值為0
如 :int a[10]={0,0,0,0,0,0,0,0,0,0}; 或 int a[10]={0};
4)在對全部數(shù)組元素賦初值時(shí),由于數(shù)據(jù)的個(gè)數(shù)已經(jīng)確定,因此可以不指定數(shù)組的長度
如:int a[5]={1,2,3,4,5}; 可以寫成 int a[]={1,2,3,4,5};
注意:如果在定義數(shù)值型數(shù)組時(shí),指定了數(shù)組的長度并對之初始化,凡未被初始化列表指定初始化的數(shù)組元素,系統(tǒng)會把它們初始化為0
(如果是字符型
數(shù)組,則初始化為'\0'
,如果是指針型數(shù)組
,則初始化為NULL
,及空指針)
(4)數(shù)組舉例
例1、用數(shù)組解決斐波那契數(shù)列問題,求前20個(gè)斐波那契數(shù)列
#includevoid main()
{int a[20],i,t=0;
a[0]=1;
a[1]=1;
for(i=2;i<20;i++){a[i]=a[i-1]+a[i-2];
}
for(i=0;i<20;i++){if(i%4==0)printf("\n");
printf("%d\t",a[i]);
}
}
例2、有10個(gè)地區(qū)面積,要求對它們按由小到大的順序排列(冒泡排序)
#includevoid main()
{int a[10], i, j, t;
for (i=0; i<10;i++){scanf("%d", &a[i]);
}
for(i=0;i<10-1;i++)//外層循環(huán)n-1次
{for(j=0;j<10-i-1;j++)//內(nèi)層循環(huán)比較次數(shù)-1
{ if(a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for (i = 0; i< 10; i++){printf("%d\n", a[i]);
}
}
2、二維數(shù)組的定義及使用一維數(shù)組的數(shù)組
放批量同類型數(shù)據(jù),數(shù)組元素在內(nèi)存中連續(xù)存放(按行存放,第一行存放完再存放第二行…),數(shù)組名代表數(shù)組首地址,是一個(gè)地址常量
(1)數(shù)組聲明
語法:
類型 數(shù)組名[常量表達(dá)式] [常量表達(dá)式];
注意:
1)類型是任意合法的類型
2)[]里一定是常量,代表數(shù)組元素的個(gè)數(shù)
??定義二維數(shù)組 float[3][4],C語言對二維數(shù)組采用這樣的定義方式,使得二維數(shù)組可被看作一種特殊的一維數(shù)組:它的元素又是一個(gè)一維數(shù)組。把a(bǔ)看作一個(gè)一維數(shù)組,它有3個(gè)元素:a[0],a[1],a[2]
每個(gè)元素又是一個(gè)包含4個(gè)元素的一維數(shù)組
a[0]-----a[0][1] a[0][2] a[0][3] a[0][4]
a[1]-----a[1][1] a[1][2] a[1][3] a[1][4]
a[2]-----a[2][1] a[2][2] a[2][3] a[2][4]
可以把a(bǔ)[0],a[1],a[2]看作3個(gè)一維數(shù)組的名字,上面定義的二維數(shù)組可以理解為定義了3個(gè)一維數(shù)組相當(dāng)于
float a[0][4] ,a[1][4],a[2][4],a[3][4]
(2)數(shù)組元素的引用
語法
數(shù)組名[行標(biāo)][列標(biāo)]
通常用雙層循環(huán)遍歷二維數(shù)組,外層控制行,內(nèi)層控制列
(3)數(shù)組初始化(定義的同時(shí)賦值)
1)分行給二維數(shù)組賦初值
如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
2)可以將所有數(shù)據(jù)寫在一個(gè)花括號內(nèi),按數(shù)組元素在內(nèi)存的排列順序?qū)Ω髟刭x初值
如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
3)可以對部分元素賦初值
如:int a[3][4]={{1},{2},{3}};
4)如果全部賦值,則數(shù)組第一維可以不寫,但第二維必須寫
如:int a[2][3]={1,2,3,4,5,6} 等價(jià)于 int a[][3]={1,2,3,4,5,6}
例3、將一個(gè)二維數(shù)組的行和列互換,存到另一個(gè)二維數(shù)組中
#includevoid main()
{int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
for(i=0;i<2;i++){for(j=0;j<3;j++){ b[j][i]=a[i][j];
}
}
}
例4、有一個(gè)3×4的矩陣,求出其中大值和行號列號
#includevoid main()
{int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i,j,max=1,r,l;
for(i=0;i<3;i++){for(j=0;j<4;j++){ if(a[i][j]>max){ max=a[i][j];
r=i;
l=j;
}
} ;
}
printf("大值%d行號%d列號%d",max,r,j);
}
3、字符數(shù)組的定義及使用(1)數(shù)組聲明
語法:
char 數(shù)組名[常量表達(dá)式];
(2)初始化
初始化列表,把各個(gè)字符以此賦值給數(shù)組中各元素,可以全部賦值,也可以部分賦值(其余元素都是默認(rèn)值)全賦值數(shù)組大小可以省略
如:char a[6]={‘C’,‘h’,‘i’,‘n’,‘a(chǎn)’};
注意:
1??如果在定義字符數(shù)組時(shí)不進(jìn)行初始化,則數(shù)組中各個(gè)元素的值時(shí)不可預(yù)料的。
2??如果花括號中提供的初值個(gè)數(shù)(即字符個(gè)數(shù))大于數(shù)組長度,則出現(xiàn)語法錯誤
3??如果初值個(gè)數(shù)小于數(shù)組長度
,則只將這些字符給數(shù)組中前面那些元素,其余的元素自動定義為空字符(即'\0')
(3)數(shù)組元素引用
數(shù)組名[下標(biāo)]
(4)字符串結(jié)束標(biāo)志
1)c系統(tǒng)在用字符數(shù)組存儲字符串常量時(shí)會自動加一個(gè)’\0’作為結(jié)束字符
如:char a[6]={“China”}; 共有5個(gè)字符
,在數(shù)組中占6個(gè)字節(jié)
,最后一個(gè)’\0’是系統(tǒng)自動加上的
2)第二種字符串初始化方法
如:char a[]={“China”} 可以寫成char a[]=“China”;
3)字符數(shù)組并不要求最后一個(gè)字符為’\0’,甚至可以不包含’\0’
如:char a[6]={‘C’,‘h’,‘i’,‘n’,‘a(chǎn)’};
(5)字符數(shù)組的輸入輸出
1)逐個(gè)字符輸入輸出,格式符%c
2)整個(gè)字符串輸入輸出,格式符%s
3)輸出的字符不包括結(jié)束符’\0’
4)如果一個(gè)字符數(shù)組包含一個(gè)以上的’\0’,則遇到第一個(gè)’\0’時(shí)輸出結(jié)束
5)系統(tǒng)把空格符作為輸入的字符串之間的分隔符,因此只將空格前的字符"How"送到 str 中,吧"How"作為一個(gè)字符串處理,故在其后加’\0’
如:char str[13]; scanf("%s",str); 輸入 How are you 輸出 How
6)scanf函數(shù)中輸入項(xiàng)如果是字符數(shù)組名,不要再加地址符&,八進(jìn)制輸出數(shù)組首地址 如:printf("%o",str);
(6)字符串處理函數(shù)
1??puts輸出字符串函數(shù)
語法:puts(字符數(shù)組)
作用:將一個(gè)字符串(以’\0’結(jié)束的字符序列)輸出到終端,用puts函數(shù)輸出的字符串可以包含轉(zhuǎn)義字符
如:char str[]={"China\nBeijing"}; puts(str);
在用puts輸出時(shí)將字符串結(jié)束標(biāo)志'\0'轉(zhuǎn)換成'\n'
,即輸出玩字符串后換行
2??gets輸入字符串函數(shù)
語法:gets(字符數(shù)組)
作用:從終端輸入一個(gè)字符串到字符串?dāng)?shù)組,并且得到一個(gè)函數(shù)值
如:char a[]={"Computer"};gets(a);
3??strcat字符串連接函數(shù)
語法:stract(字符串?dāng)?shù)組1,字符串?dāng)?shù)組2)
作用:把兩個(gè)字符數(shù)組中的字符串連接起來,把字符串2接到字符串1的后面,結(jié)果放在字符數(shù)組1中,函數(shù)調(diào)用后得到一個(gè)函數(shù)值------字符數(shù)組1的地址
如:
#includevoid main()
{char str1[20]={"China"},str2[]={"Beijing"};
strcat(str1,str2);
printf("%s",str1);
}
ChinaBeijing
注意:①字符數(shù)組1必須足夠大,以便容納連接后的新字符串
②連接時(shí)將字符串1后面的’\0’取消,只在新字符串最后保留’\0’
4??strcpy和strncpy字符串復(fù)制函數(shù)
語法:strcpy(字符數(shù)組1,字符數(shù)組2)
作用:將字符串2復(fù)制到字符串1中去
如:
#includevoid main()
{char str1[]={"Bejing"},str2[]={"China"};
strcpy(str1,str2);
printf("%s",str1);
}
China
注意:①字符數(shù)組1必須定義足夠大,以便容納被定義的字符數(shù)組2,字符數(shù)組1的長度不應(yīng)小于字符數(shù)組2的長度
②字符串2可以是數(shù)組名也可以是一個(gè)字符串常量
如:strcpy(str1,“China”);
③可以用strncpy將字符串2中前面n個(gè)字符復(fù)制到字符數(shù)組1中去,但復(fù)制的字符個(gè)數(shù)n不應(yīng)多于原有的字符(不包括’\0’);
如:strncpy(str1,str2,2);
5??strcmp字符串比較函數(shù)
語法:strcmp(字符串1,字符串2)
作用:比較字符串1和字符串2
如:strcmp(“China”,“Beijing”);
說明:字符串比較規(guī)則是:將兩個(gè)字符串自左至右逐個(gè)字符相比(按照ASCII碼值大小比較,小寫字母比大寫字母大
),直到出現(xiàn)不同字符
或遇到'\0'為止
,
比較結(jié)果由函數(shù)值帶回:
①如果字符串1與字符串2相同,則函數(shù)值為0
②如果字符串1>字符串2,則函數(shù)值為一個(gè)正整數(shù)
③如果字符串1<字符串2,則函數(shù)值為一個(gè)負(fù)整數(shù)
如:
#includevoid main()
{char str1[]={"Bejing"},str2[]={"China"};
printf("%d",strcmp(str1,str2));
}
-1
6??strlen測字符串長度函數(shù)
語法:strlen(字符串?dāng)?shù)組)
作用:測字符串長度,函數(shù)的值為字符串中的實(shí)際值
如:
#includevoid main()
{char str1[]={"Bejing"};
printf("%d",strlen(str1));
}
6
7??strlwr轉(zhuǎn)換為小寫函數(shù)
語法:strlwr(字符串)
8??strupr轉(zhuǎn)換為大寫函數(shù)
語法strupr(字符串)
字符數(shù)組舉例
例1、輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞,單詞之間用空格分隔開
#includevoid main()
{char a[20];
int i,world,sum=1;
gets(a);
for(i=0;a[i]!='\0';i++){if(a[i]==' '){world=0;
}else if(world==0){sum++;
world=1;
}
}
printf("單詞個(gè)數(shù)%d",sum);
}
l am a boy
單詞個(gè)數(shù)4
六、函數(shù)函數(shù)就是功能。每一個(gè)函數(shù)用來實(shí)現(xiàn)一個(gè)特定的功能。函數(shù)的名字反映其代表的功能,完成一定功能的模塊(算法),實(shí)現(xiàn)代碼的復(fù)用
例1、輸出以下結(jié)果,用函數(shù)調(diào)用實(shí)現(xiàn)
#includevoid main()
{void star();
void word();
star();
word();
star();
}
void star(){printf("***********************\n");
}
void word(){printf("How do you do!\n");
}
***********************
How do you do!
***********************
函數(shù)分類:
(1)用戶使用角度①庫函數(shù)②用戶自己定義的函數(shù)
(2)函數(shù)的形式角度①無參函數(shù)②有參函數(shù)
定義函數(shù)包括以下內(nèi)容:
定義函數(shù)的方法:
分為函數(shù)首部(函數(shù)頭),函數(shù)體兩部分
語法:
返回值類型(函數(shù)類型) 函數(shù)名(形參表列)--------函數(shù)首部
{
聲明部分(變量定義或函數(shù)聲明) --------函數(shù)體
執(zhí)行部分(語句)
}
注意:
函數(shù)的輸出
)的確定,首先判斷函數(shù)是否需要返回一個(gè)值,如果需要再看返回值的類型,如果沒有返回值,則明確聲明為void,一定注意,返回值只能有一個(gè),如果多于一個(gè),只能通過別的方式帶回,此時(shí)也將函數(shù)返回值類型聲明為void
其余單詞首字母大寫
相當(dāng)于函數(shù)的輸入
,如果函數(shù)不需要已知條件,則空著,此時(shí)是無參函數(shù)。此時(shí)形參相當(dāng)于已經(jīng)有值(在函數(shù)調(diào)用時(shí),由實(shí)參傳遞過來的值)
,不需要重新賦值,如果函數(shù)需要返回一個(gè)值,用return 語句帶回(return語句將后面表達(dá)式的值帶回到函數(shù)調(diào)用處,并結(jié)束函數(shù)的調(diào)用,return后面可以不加表達(dá)式,此時(shí)僅僅結(jié)束函數(shù)的調(diào)用,return語句可以有多個(gè),但只有一個(gè)會執(zhí)行)例1、求兩個(gè)數(shù)中的大值
int max(x,y){return x>y?x:y;
}
例2、求兩個(gè)數(shù)的大公約數(shù)
例3、求兩個(gè)數(shù)的最小公倍數(shù)
1、函數(shù)調(diào)用的形式
語法:
函數(shù)名(實(shí)參表列)
注意:
(1)函數(shù)調(diào)用語句
把函數(shù)調(diào)用單獨(dú)作為一個(gè)語句,不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作
(2)函數(shù)表達(dá)式
函數(shù)調(diào)用出現(xiàn)在另一個(gè)表達(dá)式中,如:c=max(a,b),max(a,b)是一次函數(shù)的調(diào)用,他是賦值表達(dá)式中的一部分。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算
(3)函數(shù)參數(shù)
函數(shù)調(diào)用作為另一個(gè)函數(shù)調(diào)用時(shí)的實(shí)參,如:m=max(a,max(b,c));
2、函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞
(1)形式參數(shù)和實(shí)際參數(shù)
1)定義函數(shù)
時(shí)函數(shù)名后面括號中的變量名稱為形式參數(shù)
2)在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)
時(shí),函數(shù)名后面括號中的參數(shù)為實(shí)際參數(shù)。實(shí)際參數(shù)可以是常量、變量或表達(dá)式
(2)實(shí)參和形參間的數(shù)據(jù)傳遞
調(diào)用過程中,系統(tǒng)會把實(shí)參的值傳遞給被調(diào)用函數(shù)的形參
例1、輸入兩個(gè)整數(shù),求出其中較大者
#includevoid main()
{int a,b;
int max(x,y);
scanf("%d%d",&a,&b);
printf("較大的數(shù)是:%d",max(a,b));
}
int max(int x,int y){return x>y?x:y;
}
5 8
較大的數(shù)是:8
注意:
①在發(fā)生函數(shù)調(diào)用時(shí),首先程序執(zhí)行的流程轉(zhuǎn)到被調(diào)用函數(shù),會給被調(diào)用函數(shù)的局部變量
(定義在函數(shù)內(nèi)部的變量,包括形參)分配內(nèi)存空間
,會將實(shí)參的值對應(yīng)地傳給形參
②在函數(shù)調(diào)用結(jié)束時(shí)(return語句
或遇到函數(shù)體結(jié)束的右括號
),程序執(zhí)行的流程轉(zhuǎn)到主調(diào)函數(shù)中函數(shù)調(diào)用處
,回收被調(diào)用函數(shù)的局部變量
(定義在函數(shù)內(nèi)部的變量,包括形參)所占內(nèi)存空間
,如果需要return返回1個(gè)值,則把這個(gè)值帶回函數(shù)調(diào)用處
因此,除了main函數(shù)外,其他函數(shù)中的局部變量只在被調(diào)用期間占有內(nèi)存空間,不同函數(shù)的局部變量可以重名,僅僅是重名,一定占用不同的內(nèi)存空間
(3)函數(shù)調(diào)用的過程
1)在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),
它們并不占內(nèi)存
中的存儲單元。在函數(shù)發(fā)生調(diào)用時(shí)
,函數(shù)的形參才被臨時(shí)分配存儲單元
2)將實(shí)參的值傳給對應(yīng)的形參
3)利用形參的值進(jìn)行運(yùn)算
4)通過return語句將函數(shù)值帶回到主調(diào)函數(shù)。注意返回值類型與函數(shù)類型一致,如果函數(shù)不需要返回值,則不需要return語句。這時(shí)函數(shù)的類型應(yīng)定義為void類型
5)調(diào)用結(jié)束,形參單元被釋放
。實(shí)參單元仍保留并維持原值
,沒有改變。如果在執(zhí)行一個(gè)被調(diào)用的參數(shù)時(shí),形參的值發(fā)生改變,不會改變主調(diào)函數(shù)的實(shí)參的值。因?yàn)樾螀⒑蛯?shí)參是兩個(gè)不同的存儲單元
(4)函數(shù)的返回值
1)函數(shù)的返回值是通過函數(shù)中的return語句獲得的
2)函數(shù)值的類型 如:int max(float x,float y)
3)在定義函數(shù)時(shí)指定的函數(shù)類型
一般應(yīng)該和return語句中的表達(dá)式類型
一致。如果函數(shù)值得類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對數(shù)值數(shù)據(jù),可以自動進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值得值
。如:int max(float x,float y) 返回int值
4)對于不帶回值得函數(shù),應(yīng)當(dāng)用定義函數(shù)為void類型
(1)首先被調(diào)用的函數(shù)必須是已經(jīng)定義的而函數(shù)
(2)如果使用庫函數(shù),應(yīng)該在本文件開頭使用#include指令將調(diào)用有關(guān)庫函數(shù)時(shí)所需用到的信息包含到本文件中來
(3)如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面,應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明。聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)類型等信息通知編譯系統(tǒng)
,以便在遇到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識別函數(shù)并檢查調(diào)用是否合法。
例2、輸入兩個(gè)實(shí)數(shù)求和
#includevoid main()
{float a,b;
float add(float x,float y);
scanf("%f%f",&a,&b);
printf("%f",add(a,b));
}
float add(float x,float y){return x+y;
}
1.2 1.5
2.700000
函數(shù)聲明(函數(shù)原型聲明):當(dāng)被調(diào)用函數(shù)寫在主調(diào)函數(shù)之后,此時(shí)可以在主調(diào)函數(shù)中,對被調(diào)用函數(shù)進(jìn)行聲明,方便編譯系統(tǒng)檢查函數(shù)調(diào)用表達(dá)式的正確性(檢查項(xiàng)包括函數(shù)的類型、函數(shù)名字、參數(shù)的類型、參數(shù)個(gè)數(shù)和參數(shù)的順序)。如果被調(diào)用函數(shù)寫在主調(diào)函數(shù)之前,此時(shí)函數(shù)聲明可以省略。
語法:
(1)函數(shù)返回值類型 函數(shù)名(形參1的類型 形參1,形參2類型 形參2);
如:float add(float x,float y);
(2)函數(shù)返回值類型 函數(shù)名(形參1的類型,形參2的類型…);
如:float add(float,float);
C語言的函數(shù)定義是相互平行、獨(dú)立的,也就是說,在定義函數(shù)時(shí),一個(gè)函數(shù)內(nèi)不能再定義另一個(gè)函數(shù),即不能嵌套定義,但可以嵌套調(diào)用函數(shù),即在調(diào)用函數(shù)的過程中,又調(diào)用另一個(gè)函數(shù)。
例3、輸入4個(gè)整數(shù),找出其中大的數(shù)。用函數(shù)的嵌套調(diào)用來處理
#includevoid main()
{int a,b,c,d;
int max4(int a,int b,int c,int d);
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("%d",max4(a,b,c,d));
}
int max4(int a,int b,int c,int d)
{int max;
int max2(int x,int y);
max=max2(a,b);
max=max2(max,c);
max=max2(max,d);
return max;
}
int max2(int x,int y)
{return x>y?x:y;
}
5、函數(shù)的遞歸調(diào)用在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接的調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用
例4、用遞歸的方式求n!
#includevoid main()
{int a;
int fun(int x);
scanf("%d",&a);
printf("%d",fun(a));
}
int fun(int x)
{int t;
if(x==1||x==0)
t=1;
else
{t=x*fun(x-1);
}
return t;
}
七、指針指針存在的意義:通過指針來改變變量(變量的本質(zhì)是某一塊內(nèi)存空間的別名)的值,即改變內(nèi)存空間的值。
1、什么是指針1、什么是地址
??在程序中定義了一個(gè)變量,在對程序進(jìn)行編譯時(shí),系統(tǒng)會給這個(gè)變量分配內(nèi)存單元。根據(jù)變量的類型,分配一定長度的空間(如:Visual C++ 為整型分配4個(gè)字節(jié))。內(nèi)存中每一個(gè)字節(jié)有一個(gè)編號,這就是地址
。
??C語言中的地址包括內(nèi)存編號
和數(shù)據(jù)類型
2、什么是指針
??由于通過地址能找到所需變量單元,可以說,地址指向該變量單元。因此,將地址形象化地稱為指針(通過它能找到以它為地址的內(nèi)存單元)。
3、直接訪問
通過變量名
找到相應(yīng)的地址,從字節(jié)中按照不同的存儲方式讀出變量的值
4、間接訪問
將變量的地址存放在另一變量中,然后通過該變量來找到變量的地址,從而訪問變量值
如:i_pointer=&i //將i的地址存放在i_pointer中
一種想法:
int a,b;
b=10;
a=&b;//把b的地址存放在整型變量中,雖然可以存儲,但是不能通過存儲的地址訪問數(shù)據(jù)
將數(shù)值3送到變量i中,有兩種表達(dá)方法
(1)將3直接送到變量 i 所標(biāo)識的單元中,如:i=3
(2)將3送到變量i_pointer所指向的單元,如:*i_pointer=3,其中 *i_pointer表示i_pointer指向的對象
注意:區(qū)分“指針”和“指針變量” 。如:可以說變量 i 的指針是2000,而不能說 i 的指針變量是2000。指針是一個(gè)地址指針變量是存放地址的變量
2、指針變量例1、通過指針訪問整型變量
#includevoid main()
{int a=100,b=10;
int *x,*y;
x=&a;
y=&b;
printf("%d %d\n",a,b);
printf("%d %d",*x,*y);
}
1、定義指針變量
語法:類型名 * 指針變量名
注意:
①指針變量前面的 “*” 表示該變量為指針型變量
②定義指針變量必須指定基類型。不同數(shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中所占的字節(jié)數(shù)
和存放方式
是不同的
int a;
float *b;
b=&a;//這樣寫不對
③一個(gè)變量的指針的含義包括兩個(gè)方面,一是以內(nèi)存單元編號表示的純地址,一是它指向的存儲單元的數(shù)據(jù)類型
④指向整型數(shù)據(jù)的指針類型表示為“ int * ”
⑤指針變量中只能存放地址,不能將一個(gè)整數(shù)賦給一個(gè)指針變量
如:* a=100; //不合法
2、引用指針變量
(1)給指針變量賦值,如 :p=&a; //指針變量p的值時(shí)變量a的地址
(2)引用指針變量指向的變量,如:pintf(“%d”,*p);//輸出變量a的值
如果有 *p=1;//將1賦給p當(dāng)前所指向的變量,即a=1
(3)引用指針變量的值,如:printf(“%o”,p);//以八進(jìn)制輸出p的地址
例2、輸入兩個(gè)整數(shù),按先大后小輸出(指針方法)
不交換整型變量的值,交換兩個(gè)指針的值
注意:此時(shí)改變的是地址,而不是指向的數(shù)據(jù)
#includevoid main()
{int a,b,*x,*y,*t;
scanf("%d%d",&a,&b);
x=&a;
y=&b;
if(*x<*y)
{t=x;x=y;y=t;//x=&b;y=&a;
}
printf("%d %d\n",a,b);
printf("max=%dmin=%d",*x,*y);
}
5 9
5 9
max=9min=5
3、指針變量作為參數(shù)函數(shù)
函數(shù)的參數(shù)不僅可以是整型、浮點(diǎn)型、字符型還可以是指針數(shù)據(jù)。它的作用是將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中。
例3、輸入兩個(gè)整數(shù),按先大后小輸出。用函數(shù)處理,指針類型數(shù)據(jù)作為參數(shù)
注意:此時(shí)對指針指向的數(shù)據(jù)進(jìn)行修改
#includevoid main()
{ void swap(int * x,int * y);
int a,b;
scanf("%d%d",&a,&b);
swap(&a,&b);
printf("max=%dmin=%d",a,b);
}
void swap(int * x,int * y)
{int t;
if(*x<*y)
{t=*x;
*x=*y;
*y=t;
}
}
5 9
max=9min=5
不能企圖通過改變指針形參的值而使指針實(shí)參的值改變,如下:
#includevoid main()
{ void swap(int * x,int * y);
int a,b;
scanf("%d%d",&a,&b);
swap(&a,&b);
printf("max=%dmin=%d",a,b);
}
void swap(int * x,int * y)
{int *t;
if(*x<*y)
{t=x;
x=y;
y=t;
}
}
5 9
max=5min=9
3、通過指針引用數(shù)組1、數(shù)組元素的指針
一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素。所謂數(shù)組元素的指針就是數(shù)組元素的地址
。
引用數(shù)組可以用下標(biāo)法
,如:a[3],可以用指針法
,即通過指向數(shù)組元素的指針找到所需的元素。
指針法特點(diǎn):使目標(biāo)程序質(zhì)量高(占內(nèi)存少,運(yùn)行速度快)
數(shù)組名代表數(shù)組中首元素地址,如:p=&a[0];等價(jià)于p=a;
2、引用數(shù)組元素時(shí)指針的運(yùn)算
在指針已指向一個(gè)數(shù)組元素時(shí),可以對指針進(jìn)行以下運(yùn)算:
(1)加(減)一個(gè)整數(shù)
(2)自加(減)運(yùn)算
1??如果指針變量p已指向數(shù)組中的一個(gè)元素,這p+1指向同一數(shù)組中的下一個(gè)元素
,p - 1指向同一數(shù)組中的上一個(gè)元素
2??如果p的初值為&a[0],則p+i和a+i就是數(shù)組元素a[i]的地址
。實(shí)際地址為p+1乘數(shù)據(jù)類型
3?? *(p+i)和 *(a+i)是p+i和a+i指向的數(shù)組元素,及a[i]
4??指針變量p1和p2指向同一數(shù)組中的元素,執(zhí)行p1-p2,結(jié)果是(p1-p2)/數(shù)組元素的長度。如:(2020-2012)/4=2
,這個(gè)結(jié)果是由意義的,表示p2所指的元素與p1所指的元素之間差幾個(gè)元素
.兩個(gè)地址相加沒有意義
5??數(shù)組名是指針型常量,因此不能自增或加減(常量的性質(zhì)),但是指針型常量是可以進(jìn)行加減運(yùn)算的(注意區(qū)別自增減與相加減,自增減是把加減后對值儲存到自身去的)
3、通過指針引用數(shù)組元素
(1)下標(biāo)法,如:a[i]
(2)指針法,如:*(a+i)
例4、輸出數(shù)組中全部值
(1)下標(biāo)法(2)通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素值(3)指針法
#includevoid main()
{int a[]={1,2,3,4,5,6,7,8,9,10};
int i,*p;
for(i=0;i<10;i++)
{printf("%d",a[i]);//1
}
printf("\n");
for(i=0;i<10;i++)
{printf("%d",*(a+i));//2
}
printf("\n");
for(p=a;p<(a+10);p++)
{printf("%d",*p);//3
}
}
第一種第二種效率相同,第三種比前兩種快,提高了執(zhí)行效率
注意:數(shù)組名a代表數(shù)組首元素的地址,它是一個(gè)指針型常量
,它的值在程序運(yùn)行期間是固定不變的,所有a++是錯誤的
例5、通過指針變量輸出整型數(shù)組a的10個(gè)元素
#includevoid main()
{int a[10],i,*p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;//此時(shí)p已經(jīng)指向最后一位,必須重新賦值
for(i=0;i<10;i++,p++)
printf("%d\n",*p);
}
注意:①指針變量 p 可以指向數(shù)組以后的存儲單元,雖然編譯不會出錯,但是運(yùn)行結(jié)果無法預(yù)期,所有要避免
②指向數(shù)組元素的指針變量可以帶下標(biāo),如p[ i ] 轉(zhuǎn)換為 *(p+i)
③*p++;
。由于++和 * 同優(yōu)先級,結(jié)合方向?yàn)樽杂蚁蜃?,因此它等價(jià)于 *(p++)++后置的時(shí)候,本身含義就是先運(yùn)算后增加1(運(yùn)算指的是p++作為一個(gè)整體與前面的 * 進(jìn)行運(yùn)算;增加1指的是p+1)。先引用 *p 的運(yùn)算,然后再使p加1
④ *(p++)和 *(++p)是不同的
⑤ (*p)++ 與 ++(*p)
(*p)++,使用()強(qiáng)制將 * 與p結(jié)合,只能先計(jì)算 * p,然后對 *p整體的值++
++(*p),先 * p取值,再前置++,[該值+1后]作為整個(gè)表達(dá)式的值。
語法:
#includevoid main()
{void fun(int arr[],int n);//函數(shù)聲明
int array[10];//數(shù)組定義
//省略
fun(array,10);//用數(shù)組名作為函數(shù)參數(shù)
}
void fun(int arr[],int n)//定義函數(shù)
{//省略
}
當(dāng)用數(shù)組名作為參數(shù)時(shí),如果形參數(shù)組中各個(gè)元素發(fā)生變化,實(shí)參數(shù)組元素的值隨之發(fā)生變化
(1)數(shù)組元素作為實(shí)參
。定義一個(gè)函數(shù) swap(int x,int y);調(diào)用swap(a[0],a[1]);當(dāng)x,y改變,數(shù)組值不變
(2)數(shù)組名作為實(shí)參
。因?yàn)閿?shù)組名代表該數(shù)組首地址,而形參是用來接收從實(shí)參傳遞過來的數(shù)組首地址,所以形參應(yīng)該是一個(gè)指針變量
(只有指針變量才能夠存放地址)。定義函數(shù)fun(int arr[],int n)相當(dāng)于fun(int * arr,int n)
注意:實(shí)參數(shù)組名代表一個(gè)固定地址,或者說是指針常量,但形參數(shù)組名并不是一個(gè)固定地址,而是按指針變量處理。
例6、將數(shù)組a中n個(gè)整數(shù)按相反順序存放
實(shí)參用數(shù)組名a,形參可用數(shù)組名,也可用指針變量
1、形參為數(shù)組名
#includevoid main()
{void swap(int arr[],int n);
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
swap(a,10);
for(i=0;i<10;i++)
printf(" %d",a[i]);
}
void swap(int arr[],int n)
{int i,t;
for(i=0;i<=(n-1)/2;i++)
{t=arr[i];
arr[i]=arr[n-1-i];
arr[n-1-i]=t;
}
}
1 2 3 4 5 6 7 8 9 10
10 9 8 7 5 6 4 3 2 1
2、形參為指針
#includevoid main()
{void swap(int * arr,int n);
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
swap(a,10);
for(i=0;i<10;i++)
printf(" %d",a[i]);
}
void swap(int *arr,int n)
{int *i,*j,*p,t,m;
m=(n-1)/2;//循環(huán)次數(shù)4
p=arr+m;//a[4]
i=arr;//起始值,數(shù)組首地址 a[0]
j=(arr+n-1);//最后值,數(shù)組個(gè)數(shù)-1 a[9]
for(;i<=p;i++,j--)
{t=*i;
*i=*j;
*j=t;
}
}
歸納分析
(1)形參和實(shí)參都用數(shù)組名
如:
void main()
{int a[10];
fun(a,10);
}
void fun(int x[],int n)
{}
在函數(shù)調(diào)用期間,形參與實(shí)參共用一段內(nèi)存單元
(2)實(shí)參用數(shù)組名,形參用指針
void main()
{int a[10];
fun(a,10);
}
void fun(int *x,int n)
{}
通過x值得改變可以指向數(shù)組a的任一元素
(3)實(shí)參和形參都用指針變量
void main()
{int a[10],*p;
p=a;
fun(a,10);
}
void fun(int *x,int n)
{}
通過x值得改變可以指向數(shù)組a的任一元素
(4)實(shí)參為指針變量,形參為數(shù)組名
void main()
{int a[10],*p;
p=a;
fun(a,10);
}
void fun(int x[],int n)
{}
對例6修改,形參和實(shí)參為指針
#includevoid main()
{void swap(int * arr,int n);
void swap(int *arr,int n);
int a[10],i,*p=a;
for(i=0;i<10;i++,p++)//通過指針變量自增訪問數(shù)組元素
scanf("%d",p);//p為地址,所以不用加&符
swap(a,10);
p=a;//注意要重新賦值
for(i=0;i<10;i++,p++)
printf("%d ",*p);
}
void swap(int *arr,int n)
{int *i,*j,*p,t,m;
m=(n-1)/2;//循環(huán)次數(shù)4
p=arr+m;//a[4]
i=arr;//起始值,數(shù)組首地址 a[0]
j=(arr+n-1);//最后值,數(shù)組個(gè)數(shù)-1 a[9]
for(;i<=p;i++,j--)
{t=*i;
*i=*j;
*j=t;
}
}
例7、用指針方法對10個(gè)整數(shù)按照由大到小排序
#includevoid main()
{void sort(int x[],int n);
int a[10],i,*p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
sort(a,10);
p=a;
for(i=0;i<10;i++)
printf("%d ",*p++);
}
void sort(int x[],int n)
{int i,j,t;
for(i=0;ifor(j=0;j if(x[j] t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
}
}
}
5、通過指針引用字符串1、字符串的引用方式
(1)用字符數(shù)組存放一個(gè)字符串,可以通過數(shù)組名和下標(biāo)引用字符串中的一個(gè)字符,也可以通過數(shù)組名和格式聲明%s輸出該字符串
如:
#includevoid main()
{char string[]="l love China";
printf("%s\n",string);
printf("%c\n",string[7]);
}
l love China
C
(2)用字符指針變量指向一個(gè)字符串常量,通過字符指針變量引用字符串常量
如:
#includevoid main()
{char * string="l love China";//定義字符指針變量string并初始化
printf("%s\n",string);
}
l love China
對字符串指針變量string初始化,實(shí)際上是把字符串第一個(gè)元素的地址(即存放字符串的字符串?dāng)?shù)組的首地址)賦給指針變量string,使string指向字符串的第一個(gè)字符
注意:
①在C語言中只有字符變量,沒有字符串變量
②在定義char * string="l love China";
時(shí)不是吧“l(fā) love China”這些字符串存放到string中(指針變量只能存放地址),只是把“l(fā) love China”的第一個(gè)字符的地址賦給指針變量string
③可以對指針變量進(jìn)行再賦值,string="l am a student";
此后string就指向“l(fā) am a student”的第一個(gè)字符,不能再引用“l(fā) love China”了
④printf("%s",string);
系統(tǒng)會輸出string所指向的字符串第一個(gè)字符,然后自動使string+1指向下一個(gè)字符,再輸出字符,往復(fù)直到遇到'0'
為止
例8、將字符串a(chǎn),復(fù)制為字符串b,然后輸出字符串b
數(shù)組下標(biāo)法:
#includevoid main()
{char a[]="l love China",b[20];
int i;
for(i=0;*(a+i)!='\0';i++)
{*(b+i)=*(a+i);
}
*(b+i)='\0';
printf("%s\n",a);
printf("%s\n",b);
}
指針法:
#includevoid main()
{char a[]="l love China",b[20];
int i;
char *p1,*p2;
p1=a;p2=b;
for(i=0;*(p1+i)!='\0';i++)
{*(p2+i)=*(p1+i);
}
*(p2+i)='\0';
printf("%s\n",a);
printf("%s\n",b);
}
八、結(jié)構(gòu)體
1、結(jié)構(gòu)體類型的定義1、自己建立結(jié)構(gòu)體類型
用戶自己建立由不同類型數(shù)組組成的組合型的數(shù)據(jù)結(jié)構(gòu),它成為結(jié)構(gòu)體
語法:struct 結(jié)構(gòu)體名 {成員表列};
(1)struct是聲明結(jié)構(gòu)體類型時(shí)必須使用的關(guān)鍵字,不能省略
(2)結(jié)構(gòu)體名是由用戶指定的,以區(qū)別于其它結(jié)構(gòu)體類型
(3)花括號內(nèi)是該結(jié)構(gòu)體所包括的子項(xiàng),成為結(jié)構(gòu)體的成員
成員可以屬于另一個(gè)結(jié)構(gòu)體類型
如:
struct Date
{int year;
int month;
int day;
};
struct Student
{int num;
char name[20];
char sex;
int age;
struct Date birthday;//成員birthday屬于struct Date類型
char addr[30];
};
2、定義結(jié)構(gòu)體類型變量
前面只是建立了一個(gè)結(jié)構(gòu)體類型,它相當(dāng)于一個(gè)模型,并沒有定義變量,其中并無數(shù)據(jù),系統(tǒng)對之也不分配存儲單元。
先聲明結(jié)構(gòu)體類型,再定義該類型的變量
如:struct Student student1,student2;
在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配存儲單元。根據(jù)結(jié)構(gòu)類型中包含的成員情況 Student (4+20+1+4+12+30=71)
在聲明類型的同時(shí)定義變量
語法:struct 結(jié)構(gòu)體名 {成員列表}變量名列表;
如:
struct Student
{int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student1,student2;
不指定類型名而直接定義結(jié)構(gòu)體類型變量
語法:struct {成員列表}變量名列表;
注意:
①結(jié)構(gòu)體類型與結(jié)構(gòu)體變量名是不同概念,在編譯時(shí),對類型不分配空間,只對變量分配空間
②結(jié)構(gòu)體類型中的成員名可以與程序中的變量名相同,但二者不代表同一對象
③對結(jié)構(gòu)體類型中的成員,可以單獨(dú)使用,它的作用與地位相當(dāng)于成員變量
3、結(jié)構(gòu)體變量的初始化和引用
在定義結(jié)構(gòu)體變量時(shí),可以對它初始化,即賦予初始值,然后引用這個(gè)變量
例1、把一個(gè)學(xué)生的信息(包括學(xué)號、姓名、性別、住址)放在一個(gè)結(jié)構(gòu)體變量中,然后輸出這個(gè)學(xué)生的信息
#includevoid main()
{struct Student
{int num;
char name[20];
char sex;
char addr[30];
} student1={111,"liu wei",'M',"wei hai"};
printf("%d %s %c %s",student1.num,student1.name,student1.sex,student1.addr);
}
111 liu wei M wei hai
(1)是對結(jié)構(gòu)體變量的初始化,而不是對結(jié)構(gòu)體類型的初始化
C99標(biāo)準(zhǔn)允許對某一成員初始化,如:struct Student studnet1={.num=1}
.num隱含代表結(jié)構(gòu)體變量student1中的成員變量student1.num
(2)可以引用結(jié)構(gòu)體變量的值,如:結(jié)構(gòu)體變量名.成員名
(3)如果成員本身又屬于一個(gè)結(jié)構(gòu)體類型,則要用若干個(gè)成員變量符,一級一級地找到最低的一級的成員。只能對最低級的成員進(jìn)行賦值或存取以及運(yùn)算。如:student1.birthday.year;
(4)對結(jié)構(gòu)體變量的成員可以像普通變量一樣進(jìn)行各種運(yùn)算
(5)同類型的結(jié)構(gòu)體變量可以相互賦值,如student1=student2;
(6)可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址,如:scanf("%d",&student1.num); printf("%o",&student1);
結(jié)構(gòu)體變量的地址主要用作函數(shù)的參數(shù),傳遞結(jié)構(gòu)體變量的地址
例2、輸入兩個(gè)學(xué)生的學(xué)號、姓名和成績,輸出成績較高的學(xué)生的學(xué)號、姓名和成績
#includevoid main()
{struct Student
{int num;
char name[20];
float score;
} student1,student2;
printf("學(xué)生1\n");
scanf("%d%s%f",&student1.num,student1.name,&student1.score);
printf("學(xué)生2\n");
scanf("%d%s%f",&student2.num,student2.name,&student2.score);
if(student1.score>student2.score)
printf("%d %s %.2f",student1.num,student1.name,student1.score);
else if(student1.scoreprintf("%d %s %.2f\n",student1.num,student1.name,student1.score);
printf("%d %s %.2f\n",student2.num,student2.name,student2.score);
}
}
學(xué)生1
100 liuwei 90
學(xué)生2
200 liuwe 100
200 liuwe 100.00
2、使用結(jié)構(gòu)體數(shù)組1、定義結(jié)構(gòu)體數(shù)組
語法:
(1)struct 結(jié)構(gòu)體名{成員列表} 數(shù)組名[數(shù)組長度];
(2)結(jié)構(gòu)體類型 數(shù)組名[數(shù)組長度]={初值列表}
例3、有3個(gè)候選人,每個(gè)選民只能投票選一人,要求編寫一個(gè)統(tǒng)計(jì)選票的程序,先后輸入被選人的名字,輸出各個(gè)人的得票情況
#include#includestruct Person
{char name[20];
int count;
} leader[3]={"li",0,"liu",0,"wang",0};
void main()
{char a[30];
int i,j;
for(i=1;i<=5;i++)
{scanf("%s",a);
for(j=0;j<3;j++)
{ if(strcmp(a,leader[j].name)==0) leader[j].count++;
}
}
for(i=0;i<3;i++)
{printf("%s %d\n",leader[i].name,leader[i].count);
}
}
li
liu
li
wang
li
li 3
liu 1
wang 1
3、結(jié)構(gòu)體指針結(jié)構(gòu)體指針就是指向結(jié)構(gòu)體變量的指針,一個(gè)結(jié)構(gòu)體變量的起始地址就是這個(gè)結(jié)構(gòu)體變量的指針。如果把一個(gè)結(jié)構(gòu)體變量的地址存放在一個(gè)指針變量中,那么這個(gè)指針變量就指向該結(jié)構(gòu)體變量
1、指向結(jié)構(gòu)體變量的指針
指向結(jié)構(gòu)體對象的指針變量既可以指向結(jié)構(gòu)體變量,也可指向結(jié)構(gòu)體數(shù)組中的元素。指針變量的基類型必須與結(jié)構(gòu)體變量的類型相同。
如:struct Student *p;//p可以指向struct Student 類型的變量或數(shù)組元素
例4、通過指向結(jié)構(gòu)體變量的結(jié)構(gòu)體指針變量輸出結(jié)構(gòu)體變量中的成員
#includevoid main()
{struct Student
{int num;
char name[20];
char sex;
char addr[30];
};
struct Student stu1={1010,"liu wei",'M',"wei hai"};
struct Student *pt;
pt=&stu1;
printf("%d %s %c %s\n",stu1.num,stu1.name,stu1.sex,stu1.addr);
printf("%d %s %c %s\n",(*pt).num,(*pt).name,(*pt).sex,(*pt).addr);
}
1010 liu wei M wei hai
1010 liu wei M wei hai
注意:* p兩側(cè)的括號不可省略,因?yàn)槌蓡T運(yùn)算符“.”優(yōu)先于“*”運(yùn)算符,*p.num就等價(jià)于 * (p.num)了
如果p指向一個(gè)結(jié)構(gòu)體變量stu,一下3種用法等價(jià)
(1)stu.成員名,如:stu.num;
(2)(*p).成員名,如:(*p).num;
(3)p->成員名,如:p->num;
2、指向結(jié)構(gòu)體數(shù)組的指針
例5、有3個(gè)學(xué)生的信息,放在結(jié)構(gòu)體數(shù)組中,要求輸出全部學(xué)生的信息
#include#includevoid main()
{struct Student
{int num;
char name[20];
char sex;
char addr[30];
};
struct Student stu1[3]={1010,"liu wei",'M',"wei hai",
1011,"li na",'M',"beijing",
1012,"jiayinghan",'M',"tai an"};
struct Student *pt;
pt=stu1;
for(;ptnum,pt->name,pt->sex,pt->addr);
}
1010 liu wei M wei hai
1011 li na M beijing
1012 jiayinghan M tai an
注意:
(1)如果p的初值為stu,即指向stu的序號為0的元素,p+1后,p就指向下一元素,如:
(++p)->num;//先使p+1(即stu1[1]),然后得到p指向的num值(即1011)
(p++)->num;//先得到p指向的num值(即1010),然后使p+1(即stu1[1])
(2)程序定義的p是一個(gè)指向struct Student類型的指針變量,不能存儲其他類型的地址,如:p=stu1[0].name;//stu1[0].name是stu[0]元素的成員變量name的首字符的地址
可以強(qiáng)轉(zhuǎn)后賦值,如:p=(struct Student*)stu1[0],name;
3、用結(jié)構(gòu)體變量和結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)
(1)用結(jié)構(gòu)體變量的成員作參數(shù)
(2)用結(jié)構(gòu)體變量作參數(shù)
(3)用結(jié)構(gòu)體變量的指針作參數(shù)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧