#include "stdio.h"
成都創(chuàng)新互聯(lián)始終堅持【策劃先行,效果至上】的經營理念,通過多達10余年累計超上千家客戶的網站建設總結了一套系統(tǒng)有效的網絡營銷推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:成都活動板房等企業(yè),備受客戶稱贊。
#include "conio.h"
#define NULL 0
struct student
{
char score[4];
int n;
struct student *next;
};
print()
{
struct student * head ,* p1, * p2; struct student *p;
int n=0;
p1=p2=(struct student *)malloc(sizeof(struct student));
head=NULL;
printf("intput date name,score :\n");
scanf("%d%d%d%d%d",p1-n,p1-score[0] ,p1-score[1],p1-score[2],p1-score[3],p1-score[3]);
while (p1-score[0]=0)
{
n++;
if (n==1) head=p1;
p2-next=p1;
p2=p1;
p1=(struct student *)malloc(sizeof(struct student));
printf("intput date name,score :\n");
scanf("%d%d%d%d%d",p1-n,p1-score[0] ,p1-score[1],p1-score[2],p1-score[3],p1-score[3]);
}
p2-next=NULL;
p=head;
return(p);
}
float average(*p)
{
int sum;
int m=1;
float ave;
while(p!=NULL)
{
m++;
sum=sum+p1-score[0];
p=p-next;
}
ave=sum/m;
printf("average is:%d",ave);
}
int evalue (*p)
{
int i;
int j;
int h=1;
while(p!=NULL)
{
for(i=0;i=4;i++)
{
if(p1-score[i] 60)
j++;
}
if(j=2)
{
printf("%d ",h);
}
p=p-next;
h++;
}
}
int exc(*p)
{
int num;
int m;
int r=1;
while(p!=NULL)
{
for(i=0;i=4;i++)
{
num+=p1-score[i];
}
if(num=90)
{
printf("%d\n",r;)
}
}
p=p-next;
r++;
}
main()
{
print();
average(*p);
evalue (*p);
exc(*p);
}
在VC++下運行
這是C++引用傳遞,不是C,引用又叫別名,
就是用另一個名字表示,同一對象的意思。
引用傳遞,編譯器,實際上暗地里采用了指針語法;
是另一種地址傳遞方式,和pascal的 VAR 參數(shù)一致
C語言沒有真正的地址傳遞方式,全部都是值傳遞,
不過可以通過指針的值傳遞,模擬地址傳遞方式。
不過要有明確的表示,形參為指針類型,實參為變量地址,
這樣就可以模擬址傳遞方式,真正起作用的是指針語法 *p ;和取址符
可以獲取變量和數(shù)組的地址
*可以獲取地址p中存儲的值,
數(shù)組名可以當做數(shù)組首地址
這樣C就可以間接改變變量的值。
Exchg2(int x, int y)//引用參數(shù)含義是:在函數(shù) Exchg2中傳遞過來的實參暫時叫x,y
// 函數(shù) Exchg2 一切改變x,y的操作實際是對相應實參的操作
// 函數(shù) Exchg2 一切使用x,y的操作實際是使用相應實參的操作
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d\n”,x,y);
}
main()
{
int a=4;
int b=6;
Exchg2(a,b);//在這個調用里
//Exchg2(int x, int y)//進入函數(shù)后,x就是a本身,y就是b本身
//
//
//{
//int tmp=x; x就是a本身,int tmp=x; 就是 int tmp=a;
//x=y; x就是a本身,y就是b本身 x=y;就是a= b;
//y=tmp; y就是b本身 y=tmp; 就是 b=tmp;
//print(“x=%d,y=%d\n”,x,y); 就是print(“x=%d,y=%d\n”,a,b);
//}
//概念上:引用就是所引用對象本身,引用是用另一個名字表示的同一對象!
//實現(xiàn)上:編譯器暗中用一個指針表示引用,用這個指針所指的值表示引用的值,
用這個指針的值表示引用的地址,從而即可以實現(xiàn)地址調用,
又可以表達引用語義(引用是對象的別名,代表對象本身),
Print(“a=%d,b=%d\n”, a, b);
}
我想,你只要看了C語言上關于傳值函數(shù)調用的測試題,一切都會了然于胸:
1. 考題一:程序代碼如下:
void Exchg1(int x, int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf(“x=%d,y=%d/n”,x,y)
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) ;
printf(“a=%d,b=%d/n”,a,b)
}
輸出的結果:
x=____, y=____
a=____, b=____
問下劃線的部分應是什么,請完成。
2. 考題二:代碼如下。
Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d/n”,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2(a,b);
Print(“a=%d,b=%d/n”, a, b);
}
輸出的結果為:
*px=____, *py=____
a=____, b=____
問下劃線的部分應是什么,請完成。
3. 考題三:
Exchg2(int x, int y)
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d/n”,x,y);
}
main()
{
int a=4;
int b=6;
Exchg2(a,b);
Print(“a=%d,b=%d/n”, a, b);
}
二. 函數(shù)參數(shù)傳遞方式之一:值傳遞
1. 值傳遞的一個錯誤認識
先看題一中Exchg1函數(shù)的定義:
void Exchg1(int x, int y) //定義中的x,y變量被稱為Exchg1函數(shù)的形式參數(shù)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf(“x=%d,y=%d/n”,x,y)
}
問:你認為這個函數(shù)是在做什么呀?
答:好像是對參數(shù)x,y的值對調吧?
請往下看,我想利用這個函數(shù)來完成對a,b兩個變量值的對調,程序如下:
void main()
{
int a=4,b=6;
Exchg1 (a,b) //a,b變量為Exchg1函數(shù)的實際參數(shù)。
/ printf(“a=%d,b=%d/n”,a,b)
}
我問:Exchg1 ()里頭的 printf(“x=%d,y=%d/n”,x,y)語句會輸出什么啊?
我再問:Exchg1 ()后的 printf(“a=%d,b=%d/n”,a,b)語句輸出的是什么?
程序輸出的結果是:
x=6 , y=4
a=4 , b=6 //為什么不是a=6,b=4呢?
奇怪,明明我把a,b分別代入了x,y中,并在函數(shù)里完成了兩個變量值的交換,為什么a,b變量值還是沒有交換(仍然是a==4,b==6,而不是a==6,b==4)?如果你也會有這個疑問,那是因為你跟本就不知實參a,b與形參x,y的關系了。
2. 一個預備的常識
為了說明這個問題,我先給出一個代碼:
int a=4;
int x;
x=a;
x=x+3;
看好了沒,現(xiàn)在我問你:最終a值是多少,x值是多少?
(怎么搞的,給我這個小兒科的問題。還不簡單,不就是a==4 x==7嘛!)
在這個代碼中,你要明白一個東西:雖然a值賦給了x,但是a變量并不是x變量哦。我們對x任何的修改,都不會改變a變量。呵呵!雖然簡單,并且一看就理所當然,不過可是一個很重要的認識喔。
3. 理解值傳遞的形式
看調用Exch1函數(shù)的代碼:
main()
{
int a=4,b=6;
Exchg1(a,b) //這里調用了Exchg1函數(shù)
printf(“a=%d,b=%d”,a,b)
}
Exchg1(a,b)時所完成的操作代碼如下所示。
int x=a;//←
int y=b;//←注意這里,頭兩行是調用函數(shù)時的隱含操作
int tmp;
tmp=x;
x=y;
y=tmp;
請注意在調用執(zhí)行Exchg1函數(shù)的操作中我人為地加上了頭兩句:
int x=a;
int y=b;
這是調用函數(shù)時的兩個隱含動作。它確實存在,現(xiàn)在我只不過把它顯式地寫了出來而已。問題一下就清晰起來啦。(看到這里,現(xiàn)在你認為函數(shù)里面交換操作的是a,b變量或者只是x,y變量呢?)
原來 ,其實函數(shù)在調用時是隱含地把實參a,b
的值分別賦值給了x,y,之后在你寫的Exchg1函數(shù)體內再也沒有對a,b進行任何的操作了。交換的只是x,y變量。并不是a,b。當然a,b的值沒有
改變啦!函數(shù)只是把a,b的值通過賦值傳遞給了x,y,函數(shù)里頭操作的只是x,y的值并不是a,b的值。這就是所謂的參數(shù)的值傳遞了。
哈哈,終于明白了,正是因為它隱含了那兩個的賦值操作,才讓我們產生了前述的迷惑(以為a,b已經代替了x,y,對x,y的操作就是對a,b的操作了,這是一個錯誤的觀點?。。?。
三. 函數(shù)參數(shù)傳遞方式之二:地址傳遞
繼續(xù)——地址傳遞的問題!
看題二的代碼:
Exchg2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d/n”,*px,*py);
}
main()
{
int a=4;
int b=6;
Exchg2(a,b);
Print(“a=%d,b=%d/n”, a, b);
}
它的輸出結果是:
*px=6,*py=4
a=6,b=4
看函數(shù)的接口部分:Exchg2(int *px,int *py),請注意:參數(shù)px,py都是指針。
再看調用處:Exchg2(a, b);
它將a的地址(a)代入到px,b的地址(b)代入到py。同上面的值傳遞一樣,函數(shù)調用時作了兩個隱含的操作:將a,b的值賦值給了px,py。
px=a;
py=b;
呵呵!我們發(fā)現(xiàn),其實它與值傳遞并沒有什么不同,只不過這里是將a,b的地址值傳遞給了px,py,而不是傳遞的a,b的內容,而(請好好地在比較比較啦)
整個Exchg2函數(shù)調用是如下執(zhí)行的:
px=a; //
py=b; //請注意這兩行,它是調用Exchg2的隱含動作。
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d/n”,*px,*py);
這樣,有了頭兩行的隱含賦值操作。我們現(xiàn)在已經可以看出,指針px,py的值已經分別是a,b變量的地址值了。接下來,對*px,*py的操作當然也就是
對a,b變量本身的操作了。所以函數(shù)里頭的交換就是對a,b值的交換了,這就是所謂的地址傳遞(傳遞a,b的地址給了px,py),你現(xiàn)在明白了嗎?
四. 函數(shù)參數(shù)傳遞方式之三:引用傳遞
看題三的代碼:
Exchg3(int x, int y) //注意定義處的形式參數(shù)的格式與值傳遞不同
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d/n”,x,y);
}
main()
{
int a=4;
int b=6;
Exchg3(a,b); //注意:這里調用方式與值傳遞一樣
Print(“a=%d,b=%d/n”, a, b);
}
輸出結果:
x=6, y=4
a=6, b=4 //這個輸出結果與值傳遞不同。
看到沒有,與值傳遞相比,代碼格式上只有一處是不同的,即在定義處:
Exchg3(int x, int y)。
但是我們發(fā)現(xiàn)a與b的值發(fā)生了對調。這說明了Exchg3(a,b)里頭修改的是a,b變量,而不只是修改x,y了。
我們先看Exchg3函數(shù)的定義處Exchg3(int x,int
y)。參數(shù)x,y是int的變量,調用時我們可以像值傳遞(如: Exchg1(a,b); )一樣調用函數(shù)(如: Exchg3(a,b);
)。但是x,y前都有一個取地址符號。有了這個,調用Exchg3時函數(shù)會將a,b
分別代替了x,y了,我們稱x,y分別引用了a,b變量。這樣函數(shù)里頭操作的其實就是實參a,b本身了,也就是說函數(shù)里是可以直接修改到a,b的值了。
最后對值傳遞與引用傳遞作一個比較:
1. 在函數(shù)定義格式上有不同:
值傳遞在定義處是:Exchg1(int x, int y);
引用傳遞在這義處是:Exchg1(int x, int y);
2. 調用時有相同的格式:
值傳遞:Exchg1(a,b);
引用傳遞:Exchg3(a,b);
3. 功能上是不同的:
值傳遞的函數(shù)里操作的不是a,b變量本身,只是將a,b值賦給了x,y函數(shù)里操作的只是x,y變量而不是a,b,顯示a,b的值不會被Exchg1函數(shù)所修改。
引用傳遞Exchg3(a,b)函數(shù)里是用a,b分別代替了x,y。函數(shù)里操作的是a,b。