版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
C語言項目設計教程C語言項目設計教程
項目要點:指針的概念、指針變量的定義、初始化和引用指向變量的指針變量指向數(shù)組的指針變量指針變量作為函數(shù)參數(shù)學習目標:熟悉各種指針變量的使用場景掌握指針變量作為函數(shù)參數(shù)的應用熟練地運用指針實現(xiàn)數(shù)組的輸入、輸出項目六用指針優(yōu)化學生成績管理系統(tǒng)
工作任務導入工作任務改進學生成績管理系統(tǒng),用指針來實現(xiàn)學生管理系統(tǒng)中的主要功能模塊:①錄入和輸出班級M名學生N門課程的成績;②統(tǒng)計班級學生的總分和平均分;③輸出班級學生的成績單。學生的信息包括學號、N門課程的成績、總分和平均分。其它各功能由學生自主完成。程序運行結果如圖所示。
工作任務導入引導問題(1) 指針是什么?如何定義和引用?(2) 如何用指針實現(xiàn)數(shù)組的輸入和輸出?(3) 如何在函數(shù)中用指針實現(xiàn)班級成績單的輸出?本項目由3個任務組成。任務1是了解指針;任務2是用指針優(yōu)化學生成績的輸入和輸出;任務3是用指針優(yōu)化輸出班級學生成績單。任務分析:熟悉指針的概念,掌握指針變量的定義和引用以及指針作為函數(shù)參數(shù)的用法。任務1了解指針地址
計算機內(nèi)存是以字節(jié)為單位的存儲空間,內(nèi)存的每一個字節(jié)都有一個唯一的編號,這個編號就稱為地址。按變量地址存取變量值的方式稱為“直接訪問”方式。將一個變量的地址存放在另一個內(nèi)存單元(即變量)中,然后通過存放地址的變量來引用變量,這種存放地址的變量是一種特殊的變量,我們稱它為指針變量。6.1.1地址和指針的概念指針變量的定義
用來存放數(shù)據(jù)地址的變量叫指針變量。指針變量和其它類型的變量一樣,也必須先定義后使用。定義格式:數(shù)據(jù)類型*變量名[=地址表達式];“數(shù)據(jù)類型”表示該指針可以指向何種類型的數(shù)據(jù),指針本身則是整型?!?”是一個說明符,表示定義指針變量。例如:intx,*pointer1;pointer1=&x;則pointer1表示x的內(nèi)存地址。6.1.2指向變量的指針變量練一練定義單精度浮點型變量a、指針變量p。指針變量的引用
1、與指針有關的兩個運算符&和*(1)運算符&
取地址運算符,即取其操作數(shù)的內(nèi)存地址。一目運算符,優(yōu)先級和結合性與++、--相同。一般形式:&變量名或&數(shù)組元素名如:&x 運算結果是x的地址
&a[1]運算結果是數(shù)組元素a[1]的地址例:定義intx,*y=&x; x的地址是3000,x的值是10,y=3000
思考:若x的值是100,y的值?(2)運算符*(間接)訪問地址運算符,又稱指針運算符,取其變量的值。一目運算符,優(yōu)先級和結合性與++、--相同。一般形式:*變量名如:*p*q2、指針指向?qū)ο螅ㄒL問的數(shù)據(jù))的方法(1)指針初始化例:inta,*p=&a;/*指針p指向整型變量a*/floatx,y,*p1=&x,*p2=&y;/*指針p1和p2分別指向?qū)嵭妥兞縳、y*/
intb[10],*q=b;/*指針q指向整型數(shù)組b*/(2)用賦值語句給指針賦值例:inta,b[10],*p,*q;p=&a;q=b;注意:賦值語句中的指針前面不帶“*”號。(3)使用指針應注意的問題:①作為指針要訪問的數(shù)據(jù)一定要在相應的指針之前定義。例如:char*p=&c;charc;
是錯誤的,因為編譯char*p=&c時,變量c還未分配存儲單元。②指針必須存放地址量。例如:
inta,*p;p=a;是錯誤的,因為a不是地址量。③未指向數(shù)據(jù)的指針不能引用。例如:
int*p;*p=5;
是錯誤的,因為指針p未指向某個數(shù)據(jù),其值未定。3、指針變量的算術運算含義:對于地址的運算,只能進行整型數(shù)據(jù)的加、減運算。規(guī)則:指針變量p±n表示將指針指向的當前位置向前或向后移動n個存儲單元。指針變量的算術運算結果是改變指針的方向。指針變量算術運算的過程:
p=p+n;p=p-n;問題6.1用&和*運算符編寫程序,說明指針變量的使用。【程序代碼】main(){intx=10,a,*p;longy=100000,b,*q;p=&x;a=*p;q=&y;b=*q;printf(“a=%d\n”,a);printf(“b=%ld\n”,b);printf(“&x=%x,%x\n”,&x,p);printf(“&y=%x,%x\n”,&y,q);}問題6.2利用指針變量訪問變量x和y。【程序代碼】main(){intx=100,*px;floaty=56,*py;
px=&x;
py=&y;
printf(“%d %f\n”,x,y); /*直接訪問*/
printf(“%d %f\n”,*px,*py);/*間接訪問*/}【說明】第一個printf的執(zhí)行是根據(jù)變量x和y與地址對應關系,直接將其值輸出;第二個printf的執(zhí)行是根據(jù)px和py內(nèi)存放的地址值,找到變量x和y內(nèi)存放的數(shù)據(jù),然后將其輸出。運行結果:100 56.000000 100 56.000000問題6.3從鍵盤輸入兩個整數(shù),按由大到小的順序輸出。#include”stdio.h”voidmain(){
int*p1,*p2,a,b,t;/*定義整型指針變量與整型變量*/
scanf("%d%d",&a,&b);p1=&a;/*使指針變量p1指向整型變量a*/p2=&b;/*使指針變量p2指向整型變量b*/if(*p1<*p2){/*交換指針變量所指向的變量之值*/t=*p1;*p1=*p2;*p2=t;}
printf("%d,%d\n",a,b);}練一練用指針指向三個整型變量,按由小到大的順序輸出。函數(shù)的參數(shù)不僅可以使用整型、實型、字符型等數(shù)據(jù),也可以是指針類型。它的作用是將一個變量的地址傳送到另一個函數(shù)中。6.1.3指針變量作為函數(shù)參數(shù)問題6.4輸入兩個整數(shù)a、b,將兩個整數(shù)交換輸出。程序一:voidswap(int
x,inty){
intt;t=x;x=y;y=t;}main(){
int
a,b;
scanf(“%d%d”,&a,&b);
swap(a,b);
printf(“%d,%d\n”,a,b);}將該程序改為指針作實參和形參,程序二:voidswap(int*x,int*y){
intt;t=*x;*x=*y;*y=t; }main(){
int
a,b;
scanf(“%d%d”,&a,&b);
swap(&a,&b);
printf(“%d,%d\n”,a,b);}練一練若swap()函數(shù)改為下面的程序:swap(int*x,int*y){
int*t;t=x;x=y;y=t; }能否通過改變指針形參的值而使指針實參的值也改變,請同學們思考?問題6.5輸入任意兩個實數(shù),輸出其中最大的數(shù)。【程序代碼】floatmax(float*p,float*q){floatm;m=*p>*q
?*p
:*q; returnm; }main(){floata,b,*pa=&a,*pb=&b;
scanf(“%f%f”,pa,pb);
printf(“MAX=%.2f\n”,max(pa,pb));}
練一練編寫函數(shù)mul(int*p,int*q),功能是求解兩個數(shù)的乘積。編寫change函數(shù),將主函數(shù)中變量x和y的數(shù)值擴大10倍。任務分析
用指針實現(xiàn)班級M名學生N門課程成績的輸入和輸出。此處用二維數(shù)組保存M名學生N門課程的成績。要解決這個問題,必須要懂得指向一維數(shù)組、二維數(shù)組元素的指針和一維數(shù)組、二維數(shù)組元素的指針訪問方式。任務2優(yōu)化學生成績的錄入模塊
6.2.1
使用指針輸入和輸出學生的成績
可采用下標法、數(shù)組名訪問法和指針變量訪問法3種方法訪問數(shù)組元素,輸出M名學生的成績。為簡單起見,將學生人數(shù)定為5人,課程為3門。解決方法:程序可參考書本P.170(三種方法)C語言中的指針和數(shù)組有著密切的關系。由于數(shù)組在內(nèi)存中占用一片連續(xù)的存儲單元,任何通過數(shù)組下標可以完成的操作,都可以通過指針來完成。而且使用指針速度更快,程序更緊湊。因此,如果定義一個指向數(shù)組的指針,將該指針指向數(shù)組的第一個元素,則通過改變指針的值,就可以存取數(shù)組的每一個元素。6.2.2
指向數(shù)組元素的指針由于指針變量存放的是內(nèi)存的地址,改變指向數(shù)組的指針變量的值,就可以指向不同的數(shù)組元素。指向數(shù)組的指針,可以進行下面的幾種運算。1、指針與整數(shù)相加減(指針的移動)p++、++p、p+=1向高地址移動,指向后一個元素p--、--p、p-=1向低地址移動,指向前一個元素p+=n向高地址移動,指向后n個元素p-=n向低地址移動,指向前n個元素2、兩個同類型指針相減相減的結果是兩個指針之間的元素個數(shù)。3、同類型指針的比較比較的結果是兩個指針所指數(shù)組元素之間的前后關系。例如,設指針p和q分別指向同一數(shù)組的元素a[m]和a[n],那么,若有關系表達式p>q,其值為1,則表示a[m]的位置在a[n]之前。問題6.7求指針p、q之間的元素個數(shù)?!境绦虼a】main(){floata[10],*p,*q;p=&a[0];q=&a[5];
printf(“q-p=%d\n”,q-p);}【說明】
將指針p、q相減,實際是將其對應的地址進行相減,得到的應該是指針p、q之間的元素個數(shù)。運行結果:q-p=5
數(shù)組的指針是指數(shù)組的首地址,數(shù)組元素的指針是指數(shù)組元素的地址。注:引用一個數(shù)組元素,可有兩種方法:
1、下標法a[i]或p[i]形式
2、指針法*(a+i)、*(p+i)或*p形式6.2.3
一維數(shù)組的指針數(shù)組名a又可稱為指針常量或地址常量,利用指針p訪問數(shù)組的三種應用示例。1、采用*p++main(){
inta[]={2,4,6,8,10},*p=a;
for(;p<a+5;)
printf(“*p=%d\n”,*p++);}2、采用*(p+i)main(){
inta[]={2,4,6,8,10},*p=a,i;
for(i=0;i<5;i++)
printf(“*p=%d\n”,*(p+i));}3、采用p[i]main(){
inta[]={2,4,6,8,10},*p=a,i;
for(i=0;i<5;i++)
printf(“*p=%d\n”,p[i]);}三種方式的運行結果相同:*p=2*p=4*p=6*p=8*p=10指針移動時會改變指針變量的值,因此要注意指針的當前值。問題6.8輸出數(shù)組a的10個元素?!境绦虼a】main(){
inti,a[10],*p=a;
for(i=0;i<10;i++)
scanf(“%d”,p++);
printf(“\n”);
for(i=0;i<10;i++)
printf(“%d”,*p++);}【說明】運行結果:12345678910↙0124512041990011367404836741362367460124306821473484800顯然輸出的數(shù)值并不是a數(shù)組中每個元素的值。原因是指針p的初始值為數(shù)組a的首地址,但經(jīng)過第一個for循環(huán)讀入數(shù)據(jù)后,p已指向數(shù)組a的末尾。因此,在執(zhí)行第二個for循環(huán)時,p的值不是&a[0]了,而是a+10。故執(zhí)行循環(huán)時,每次執(zhí)行p++,p指向的是數(shù)組a后面的值,實際上就是些不定值。練一練如何解決上題中的問題?問題6.9輸入和輸出5名學生一門課程成績,采用下標法、數(shù)組名訪問法和指針變量訪問法3種方法實現(xiàn)。方法1:下標法(常用,很直觀)#include<stdio.h>main(){
intscore[5],i;
printf("請輸入5名學生1門課程的成績
\n");
for(i=0;i<5;i++)
scanf("%d",&score[i]);
printf("輸出的5名學生的成績?yōu)?/p>
:\n");
for(i=0;i<5;i++)printf("%3d",score[i]);
printf("\n");}方法2:用數(shù)組名訪問(效率與下標法相同,不常用)#include<stdio.h>main(){
intscore[5],i;
printf("請輸入5名學生1門課程的成績
\n");
for(i=0;i<5;i++)
scanf("%d",&score[i]);
printf(“輸出的5名學生的成績?yōu)椋篭n");
for(i=0;i<5;i++)printf("%3d",*(score+i));
printf("\n");}方法3:用指針變量訪問(常用,效率高)#include<stdio.h>main(){
intscore[5],i,*p;
printf("請輸入5名學生1門課程的成績
\n");
for(i=0;i<5;i++)
scanf("%d",&score[i]);
printf("輸出的5名學生的成績?yōu)?/p>
:\n");
for(p=score;p<score+5;p++)printf("%3d",*p);
printf("\n");}問題6.10數(shù)組a中有10個元素,將它們逆序輸出?!境绦虼a】#include"stdio.h"#defineN10voidmain(){
int
a[N]={1,2,3,4,5,6,7,8,9,10};
int*p,*q,i,t;
for(p=a,q=a+N-1;p<q;p++,q--){t=*p; *p=*q; *q=t; }
for(i=0;i<N;i++)
printf("%d",a[i]);}練一練輸入10個整數(shù),求這10個數(shù)的平均值。指針可以指向一維數(shù)組,也可以指向二維數(shù)組,但在概念和使用上二維數(shù)組比一維數(shù)組復雜一些。在二維數(shù)組中,整個數(shù)組有一個首地址,數(shù)組中每一行有一個首地址,稱為行地址,每個數(shù)組元素也有一個地址。二維數(shù)組在邏輯上是二維空間,但是在存儲器中則是以行為順序占用一片連續(xù)的內(nèi)存單元,其存儲結構是一維線性空間。因此,就可以把二維數(shù)組視為一維數(shù)組來處理。即把二維數(shù)組看成是一種特殊的一維數(shù)組,它的元素是一個一維數(shù)組。6.2.4
二維數(shù)組的指針如:inta[4][3];a是數(shù)組名,它包含4行,可看成是由4個元素a[0]、a[1]、a[2]和a[3]組成的一維數(shù)組,而每個元素又都是具有3個元素的一維數(shù)組:由于a代表整個二維數(shù)組的首地址,即第一行的首地址,則a+1,a+2,a+3分別代表第二行、第三行和第四行的首地址。根據(jù)二維數(shù)組的存儲結構,可采用指向二維數(shù)組元素的指針或指向二維數(shù)組行的指針訪問二維數(shù)組。一、指向二維數(shù)組元素的指針
問題6.11用指向數(shù)組元素的指針輸出二維數(shù)組的各元素?!境绦虼a】main(){
intb[2][3]={2,42,3,16,21,9};
int*p;
for(p=b[0];p<b[0]+6;p++){if((p-b[0])%3==0)printf(“\n”);printf(“%5d”,*p);}}【說明】因為p是指向數(shù)組元素的指針,每次循環(huán)使p++,指向下一個元素的指針。這是一種順序輸出數(shù)組中各元素的方法,實際上是將二維數(shù)組看成是按行連續(xù)存放的一維數(shù)組。運行結果:
242316219練一練在問題6.11已實現(xiàn)功能的基礎上,再實現(xiàn)求最大值的功能。二、指向二維數(shù)組元素的指針
指向二維數(shù)組某一行的指針,稱為行指針。定義形式;數(shù)據(jù)類型(*指針)[n]其中,指針名連同其前面的”*”一定要用圓括號括起來,n表示二維數(shù)組的列數(shù),指針指向一維數(shù)組的長度。例如:
inta[3][4];
int(*p)[4];p=a[0];行指針的移動是以行為單位,不能指向數(shù)組中的第j個元素,但可用行指針引用。當行指針p指向二維數(shù)組的第一行,則*p表示a[0],*((*p)+1)、(*p)[1]、p[0][1]均表示a[0][1],以此類推,通過行指針訪問任一個數(shù)組元素的形式有:*(*(p+i)+j) (*p+i)[j] p[i][j]問題6.12用指向二維數(shù)組元素的行指針輸出二維數(shù)組的各元素?!境绦虼a】main(){
intb[2][3]={2,42,3,16,21,9};
int(*p)[3],i,j;
for(p=b,i=0;i<2;i++){
for(j=0;j<3;j++) printf(“%5d”,*(*(p+i)+j));
printf(“\n”);}
for(p=b;p<b+2;p++){
for(j=0;j<3;j++)printf(“%5d”,*(*p+j));
printf(“\n”);}}問題6.13求出二維數(shù)組中所有元素的和?!境绦虼a】#include"stdio.h"voidmain() {
inta[3][3]={1,2,3,4,5,6,7,8,9};
int*p;
intsum=0;
for(p=*a;p<*a+9;p++) sum=sum+*p;
printf("二維數(shù)組元素的總和=%d\n",sum); }【說明】*a表示第0行第0列的地址,*a+8表示二維數(shù)組最后一個元素的位置。p++使p指向下一個數(shù)組元素。練一練用指針實現(xiàn),求出二維數(shù)組中所有元素的最大值。任務分析:任務2已經(jīng)完成M名學生3門課程成績的錄入和輸出,在此基礎上用指針實現(xiàn),輸出班級學生成績單。任務的實現(xiàn)可以采用二維數(shù)組的數(shù)組名計算i行j列元素的方法進行求和、求平均值,輸出班級學生成績表;還可以采用二維數(shù)組的指針變量計算i行j列元素的方法進行求和、求平均值,輸出班級學生成績表。任務3優(yōu)化輸出班級學生成績單6.3.1使用指針優(yōu)化學生成績管理系統(tǒng)
用指針運算輸出班級學生成績單(信息包括:學號、三門課程成績、總分和平均分)功能模塊。M名學生3門課程成績存放在M×5的二維數(shù)組中,其中后兩列用來存放每名學生的總分和平均分。解決方法:程序可參考書本P.180在項目五中介紹過用數(shù)組名做函數(shù)的實參和形參的問題。在學習指針變量之后這個問題就更容易理解了。數(shù)組名就是數(shù)組的首地址,實參在函數(shù)調(diào)用時,是把數(shù)組首地址傳送給形參,所以實參向形參傳遞數(shù)組名實際上就是傳遞數(shù)組的首地址。形參得到該地址后指向同一個數(shù)組,即形參和實參共享同一空間。這就好像同一件物品有兩個不同的名稱一樣。同樣,數(shù)組指針變量的值即為數(shù)組的首地址,當然也可以作為函數(shù)的參數(shù)使用。6.3.2指向數(shù)組的指針作函數(shù)的參數(shù)
問題6.14將數(shù)組a中的n個整數(shù)按相反的順序存放。【程序代碼】#include<stdio.h>voidinv(int
x[],intn){
int
m,temp,i,j;m=(n-1)/2;
for(i=0;i<=m;i++){j=n-1-i;temp=x[i];x[i]=x[j];x[j]=temp;}}voidmain(){
inti,*p,a[10]={1,2,3,4,5,6,7,8,9,10};p=a;inv(p,10);
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");}【說明】本題中函數(shù)的形參是數(shù)組,調(diào)用函數(shù)時將數(shù)組指針變量作為函數(shù)的實參傳遞給了形參。輸出結果:10,9,8,7,6,5,4,3,2,1問題6.15使用函數(shù)從n個數(shù)中找出最大值和最小值,并在主調(diào)函數(shù)中輸出。
#include"stdio.h"#defineN5floatmax_element(floatb[],intn);voidmain(){floata[N];float*pa=a;/*定義指針變量,并指向數(shù)組*/
inti;floatmax;
for(i=0;i<N;i++)/*輸入數(shù)據(jù)*/
scanf("%f",&a[i]);max=max_element(pa,N);/*函數(shù)調(diào)用的實參是指針*/
printf("max=%.2f\n",max);}floatmax_element(floatb[],intn)/*函數(shù)形參為數(shù)組*/{floatmax;
intj;max=b[0];
for(j=1;j<=n;j++)
if(max<b[j])max=b[j];returnmax;}
練一練將上題中函數(shù)的形參修改為指針變量實現(xiàn)同樣的功能。問題6.16輸出二維數(shù)組中各元素的值,要求用函數(shù)輸出。【程序代碼1】#include<stdio.h>voidpp(int(*p)[4]){
int
i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++) printf("%5d",*(*(p+i)+j));
printf("\n");}}voidmain(){
ints[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int
i,j;
pp(s);}【說明】題中函數(shù)參數(shù)采用指向二維數(shù)組的指針。輸出結果:1 2 3 45 6 7 89101112【程序代碼2】#include<stdio.h>voidpp(inta[][4]){
int
i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++) printf("%5d",*(*(a+i)+j));
printf("\n");}}voidmain(){
ints[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int
i,j;
pp(s);}【說明】題中函數(shù)參數(shù)采用數(shù)組,輸出結果同上。練一練將數(shù)組a中的n個整數(shù)按從高到低的順序存放。問題6.17某公司有3名銷售員銷售三個品牌的飲水機,用指針實現(xiàn)所有銷售員各類銷售量的輸入、輸出以及輸出創(chuàng)造最高銷售量的銷售員(在函數(shù)中進行)。【程序代碼】 #include"stdio.h" voidprint(int(*p)[4],intn)/*輸出數(shù)組元素的函數(shù)*/ {
inti,j;
for(i=0;i<n;i++) {
for(j=0;j<4;j++) printf("%5d",*(*(p+i)+j));
printf("\n"); } }voidget_sum(int(*p)[4],intn)/*求每個銷售員的總銷售量*/ {inti,j;
for(i=0;i<n;i++) {
for(j=0;j<3;j++) *(*(p+i)+3)+=*(*(p+i)+j); } }int
get_max(int(*p)[4],intn)/*求創(chuàng)造最高銷售量的是第幾位銷售員*/ {inti,max,k; max=*(p[0]+3); k=0;
for(i=1;i<n;i++) if(*(*(p+i)+3)>max) k=i;
returnk; }voidmain() {
ints[3][4]={182,378,290,0,282,390,450,0,382,168,246,0};
inti,k;
get_sum(s,3);
print(s,3);
printf("最高銷售量記錄為:\n"); k=get_max(s,3);
for(i=0;i<4;i++) printf("%5d",s[k][i]);
printf("\n"); }【說明】3名銷售員銷售3個品牌的飲水機的銷售量存放在一個3×4的二維數(shù)組中,其中最后一列用來存放每名銷售員銷售量之和。/*求每個銷售員的總銷售量*/voidsum(intsale[][4],intn){
int
i,j;
for(i=0;i<n;i++){
for(j=0;j<3;j++) *(*(sale+i)+3)+=*(*(sale+i)+j);}}/*求創(chuàng)造最高銷售量的是第幾位銷售員*/int
max(intsale[][4],intn){
int
i,max,k;max=sale[0][3];k=0;
for(i=0;i<n;i++)if(sale[i][3]>max) {k=i;}returnk;}/*主函數(shù)*/voidmain(){
ints[3][4]={182,378,290,0,282,390,450,0,382,168,246,0};//0的位置將存放三名銷售員各自的總銷售量
int
i,k;sum(s,3);//調(diào)用求每個銷售員總銷售量的函數(shù)
pp(s,3);//調(diào)用輸出函數(shù)
printf("最高銷售量記錄為:\n");k=max(s,3);//調(diào)用求創(chuàng)造最高銷售量的是第幾位銷售員的函數(shù)
for(i=0;i<4;i++)printf("%5d",s[k][i]);
printf("\n");}方法二:#include<stdio.h>/*輸出數(shù)組元素的函數(shù)*/voidpp(int(*p)[4],intn){
int
i,j;
for(i=0;i<n;i++){
for(j=0;j<4;j++) printf("%5d",*(*(p+i)+j));
printf("\n");}}/*求每個銷售員的總銷售量*/voidsum(int(*p)[4],intn){
int
i,j;
for(i=0;i<n;i++){
for(j=0;j<3;j++) *(*(p+i)+3)+=*(*(p+i)+j);}}/*求創(chuàng)造最高銷售量的是第幾位銷售員*/int
max(int(*p)[4],intn){
int
i,max,k;max=*(p[0]+3);k=0;
for(i=1;i<n;i++)if(*(*(p+i)+3)>max) {k=i;}returnk;}/*主函數(shù)*/voidmain(){
ints[3][4]={182,378,290,0,282,390,450,0,382,168,246,0};//0的位置將存放三名銷售員各自的總銷售量
int
i,k;sum(s,3);//調(diào)用求每個銷售員總銷售量的函數(shù)
pp(s,3);//調(diào)用輸出函數(shù)
printf("最高銷售量記錄為:\n");k=max(s,3);//調(diào)用求創(chuàng)造最高銷售量的是第幾位銷售員的函數(shù)
for(i=0;i<4;i++)printf("%5d",s[k][i]);
printf("\n");}6.4.1指向字符串的指針變量在C語言中,字符串是存放在字符數(shù)組中的。為了對字符串進行操作,可定義一個字符數(shù)組,也可以定義一個字符指針。任務4任務拓展問題6.18用字符數(shù)組實現(xiàn)?!境绦虼a】main(){chars[]=“IloveChina!”;
printf(“%s\n”,s);} 【說明】數(shù)組名s代表字符數(shù)組的首地址,實際上是字符串的存放的起始指針(因為地址就是指針,這是一個常量指針),而字符串的字符依次從低地址往高地址存放。如圖6.9所示。字符串的名字是一個地址常量。所以字符串可認為是一個指針量。運行結果:IloveChina!圖6.9一維數(shù)組存放的字符串
圖6.10按字符指針存放的字符串注:可借用定義指針的方法對字符串進行說明,通過字符指針處理字符串,而不用字符數(shù)組。上例用字符指針定義
char*s=“IloveChina!”;
這個定義語句通知計算機在內(nèi)存中開辟一個存儲區(qū)域,它的首地址由字符指針s表示,在這個區(qū)域內(nèi)依次存放”I”、”“、”l”……”!”這13個字符。如圖6.9所示。雖然沒有定義字符數(shù)組,但對字符串是按字符數(shù)組處理。練一練閱讀下面程序,寫出程序的運行結果。#include<string.h>
main(){
inti;char*pc,ac[10];pc=“abcd”;
for(i=0;pc[i]!=’\0’;i++)
ac[i]=pc[i];
ac[i]=‘\0’;
printf(“%s\t%s\t%d\n”,pc,ac,strcmp(pc,ac));}雖然用字符數(shù)組和字符指針都能實現(xiàn)字符串的存儲和運算,但它們二者之間是有區(qū)別的:1、字符數(shù)組方式:chars[]=“China”;(1)字符數(shù)組一旦定義,編譯系統(tǒng)為字符數(shù)組分配一段連續(xù)的內(nèi)存單元,每個數(shù)組元素都有自己的名字:s[0]、s[1]、……、s[5]。(2)s是數(shù)組名,是一個地址常量,不能重新賦值。(3)字符數(shù)組不能用賦值語句整體賦值,如:
s=“China”;這是錯誤的。只能逐個賦值:
s[0]=’C’、s[1]=’h’、…、s[4]=’a’
可用scanf(“%s”,s);整體輸入字符串。
字符數(shù)組與字符指針的區(qū)別2、用字符指針方式:char*sp=“China”;(1)字符指針定義時,編譯系統(tǒng)僅為字符指針*sp分配一個用于存放指針變量的單元,運行時才把字符串的首地址賦給字符指針,即字符指針sp只存放字符串的首地址,而不是字符串本身。但各字符可通過指針來引用:*(sp+0)、*(sp+1)、……。也可寫成:sp[0]、sp[1]、……的形式,但含義與數(shù)組方式不同。(2)sp是指針變量,可重新賦值。如:char*sp=“China”,*sq=“Japan”;sp=sq;(3)指針可用賦值語句整體賦值,如:
sp=“China”;問題6.19進行兩個字符串的交換?!境绦虼a】main(){char*ch1=“ABC”,*ch2=“XYZ”,*t;t=ch1;ch1=ch2;ch2=t;printf(“ch1=%s\tch2=%s\n”,ch1,ch2);}【說明】
運行結果:ch1=XYZ ch2=ABC
通過此例可以將字符指針看成字符串變量,則可以進行字符串的整體賦值,解決數(shù)組中較難解決的問題,所以,用字符指針使得字符串的處理變得更為方便和靈活。但不提倡用scanf(“%s”,sp);整體輸入字符串??上榷x一個字符數(shù)組,使字符指針指向數(shù)組的首地址,如:
chars[5],*sp=s;
scanf(“%s”,sp);
練一練用字符指針實現(xiàn)輸入兩個字符串,不用字符串連接函數(shù),將第二個字符串連接到第一個字符串后面。6.4.2程序舉例問題6.20黨支部評優(yōu)的時候,有3位候選人,現(xiàn)要求對3位候選人以姓氏的英文字母排序,請用C語言中的字符指針解決此問題?!境绦虼a】#include<stdio.h>#include"string.h"main(){char*name1="張曉麗",*name2="李剛",*name3="王偉",*t;if(strcmp(name1,name2)>0){t=name1;name1=name2;name2=t;}if(strcmp(name1,name3)>0){t=name1;name1=name3;name3=t;}if(strcmp(name2,name3)>0){t=name2;name2=name3;name3=t;}
printf("輸出的姓名為:\n");printf("%s\n",name1);printf("%s\n",name2);printf("%s\
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會設備租賃合同范例
- 委托灌裝合同范例
- 2024年西藏客運資格證模擬考試下載app
- 2024年林芝小型客運從業(yè)資格證理論考試題
- 2024年客運從業(yè)資格證考試試題庫答案大全下載
- 2024年南京客運資格證考試題目和答案
- 2024年北京客運資格證節(jié)能駕駛考試題
- 2024年武威道路客運從業(yè)資格證模擬考試
- 2024年監(jiān)控安裝合同范文6篇
- 北京市殘疾輔助器具規(guī)范及價目表
- 養(yǎng)老院健康體檢表
- Unit7 I am more outgoing than my sister.Grammar Focus-3c 課件-魯教版英語七年級上冊
- 韻母教學講解課件
- 創(chuàng)意知名畫家達芬奇?zhèn)€人生平介紹PPT
- 淺談我校啦啦操隊存在的問題以及解決措施
- 餐飲業(yè)月度收入支出費用報表
- 可隨意編輯【封面+簡歷+自薦信】淡雅歐美花紋古典求職個人簡歷
- 人教版選修《中國小說欣賞》課件:聊齋志異
- 工程量計量計算表模板監(jiān)理
- 財經(jīng)應用文寫作教案
- 2022年中國鐵路國際有限公司招考聘用高校畢業(yè)生(同步測試)模擬卷和答案
評論
0/150
提交評論