定義 含 義
int i; 定義整型變量i
int *p p為指向整型數(shù)據(jù)的指針變量
int a[n]; 定義整型數(shù)組a,它有n個元素
int *p[n]; 定義指針數(shù)組p,它由n個指向整型數(shù)據(jù)的指針元素組成
int (*p)[n]; p為指向含n個元素的一維數(shù)組的指針變量
int f(); f為帶回整型函數(shù)值的函數(shù)
int *p(); p為帶回一個指針的函數(shù),該指針指向整型數(shù)據(jù)
int (*p)(); p為指向函數(shù)的指針,該函數(shù)返回一個整型值
int **p; P是一個指針變量,它指向一個指向整型數(shù)據(jù)的指針變量
//------------------------------------------------------------------------------------------
函數(shù)的形參和實參具有以下特點:
1. 形參變量只有在被調用時才分配內(nèi)存單元,在調用結束時,即刻釋放所分配的內(nèi)存單元。
因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調用結束返回主調函數(shù)后則不能再使用該形參變量。
2. 實參可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調用時,
它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使實參獲得確定值。
3. 實參和形參在數(shù)量上,類型上,順序上應嚴格一致,否則會發(fā)生類型不匹配“的錯誤。
4. 函數(shù)調用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。
因此在函數(shù)調用過程中,形參的值發(fā)生改變,而實參中的值不會變化。
//------------------------------------------------------------------------------------------
用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實參有幾點不同:
1) 用數(shù)組元素作實參時,只要數(shù)組類型和函數(shù)的形參變量的類型一致,
那么作為下標變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致的。
因此,并不要求函數(shù)的形參也是下標變量。換句話說,對數(shù)組元素的處理是按普通變量對待的。
用數(shù)組名作函數(shù)參數(shù)時,則要求形參和相對應的實參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。
當形參和實參二者不一致時,即會發(fā)生錯誤。
2) 在普通變量或下標變量作函數(shù)參數(shù)時,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元。
在函數(shù)調用時發(fā)生的值傳送是把實參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時,不是進行值的傳送,
即不是把實參數(shù)組的每一個元素的值都賦予形參數(shù)組的各個元素。因為實際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。
那么,數(shù)據(jù)的傳送是如何實現(xiàn)的呢?在我們曾介紹過,數(shù)組名就是數(shù)組的首地址。
因此在數(shù)組名作函數(shù)參數(shù)時所進行的傳送只是地址的傳送,也就是說把實參數(shù)組的首地址賦予形參數(shù)組名。
形參數(shù)組名取得該首地址之后,也就等于有了實在的數(shù)組。實際上是形參數(shù)組和實參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。
*******************************************************************************************/
?。 nclude
?。 nclude
#i nclude
?。 nclude
?。 nclude
bit bflag;
void ser_init(void)
{
SCON = 0x50; //串口方式1,允許接收
TMOD = 0x20; //定時器1定時方式2
TCON = 0x40; //設定時器1開始計數(shù)
TH1 = 0xE8; //11.0592MHz 1200波特率
TL1 = 0xE8;
TI = 1;
TR1 = 1; //啟動定時器
}
#if 0
//例10.2通過改變指針變量的值(指針的指向)來輸出大小
void main(void)
{
while(1)
{
if(!bflag)
{
int *p1,*p2,*p,a,b;
ser_init();
printf(”input two numbers:n“);
scanf(”%d,%d“,&a,&b);
p1=&a;
p2=&b;
if(a {
p=p1;
p1=p2;
p2=p;
}
printf(”a=%d,b=%dn“,a,b);
printf(”max=%d,min=%dn“,*p1,*p2);
bflag = 1;
}
}
}
#endif
//--------------------------------------------------------------------------------------------
#if 1
//例10.5自定義函數(shù),指針作函數(shù)參數(shù)傳遞
//實參和形參共同指向變量a和b,不能通過改變形參的值而使實參發(fā)生改變。
//只有通過改變形參指向變量的值才使實參數(shù)據(jù)發(fā)生改變
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void exchange(int *q1,int *q2,int *q3)
{
if(*q1 《 *q2) swap(q1,q2);
if(*q1 《 *q3) swap(q1,q3);
if(*q2 《 *q3) swap(q2,q3);
}
void main(void)
{
while(1)
{
if(!bflag)
{
int a,b,c;
int *pointer_1,*pointer_2,*pointer_3;
ser_init();
printf(”input three numbers:n“);
scanf(”%d%d%d“,&a,&b,&c);
pointer_1 = &a;
pointer_2 = &b;
pointer_3 = &c;
exchange(pointer_1,pointer_2,pointer_3);
printf(”%d,%d,%dn“,a,b,c);
bflag = 1;
}
}
}
#endif
//------------------------------------------------------------------------------------
//實參的值沒有發(fā)生交換,只有形參的值發(fā)生了交換
#if 0
void swap(x,y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void main(void)
{
while(1)
{
if(!bflag)
{
int a,b;
ser_init();
printf(”input two numbers:n“);
scanf(”%d%d“,&a,&b);
swap(a,b);
printf(”%d,%dn“,a,b);
bflag = 1;
}
}
}
#endif
//-----------------------------------------------------------------------------------
//下標法訪問數(shù)組元素
#if 0
void main(void)
{
int a[10],i;
ser_init();
for(i=0;i《10;i++)
{
a[i]=i;
}
for(i=0;i《10;i++)
{
printf(”a[%d]=%dn“,i,a[i]);
}
}
#endif
#if 0
//指針法間接訪問數(shù)組元素和通過數(shù)組元素計算元素地址,找出元素的值
void main(void)
{
int a[10],i,*p;
ser_init();
p=a;
for(i=0;i《10;i++)
{
// a[i]=i;
*(a+i)=i;
}
for(i=0;i《10;i++)
{
printf(”a[%d]=%dn“,i,*(a+i));
}
}
#endif
//------------------------------------------------------------------------------------------
//例10.15 指針作實參傳遞給指針形參
#if 0
float aver(float *pa)
{
int i;
float av=0,sum=0;
for(i=0;i《5;i++) sum=sum + *pa++;
av=sum/5;
return av;
}
void main(void)
{
while(1)
{
if(!bflag)
{
int j;
float sco[5],av,*sp;
sp=sco;
ser_init();
printf(”input five scores:n“);
for(j=0;j《5;j++) scanf(”%f“,&sco[j]);
av=aver(sp);
printf(”%5.2fn“,av);
bflag = 1;
}
}
}
#endif
//---------------------------------------------------------------------------------------
//選擇法對10個整數(shù)排序
//思路:比如數(shù)組序列 10 45 8 55 45 41 23 17 85 63
//拿10跟后面9個數(shù)作比較,如果比9大就交換。如45比10大就跟把45的下標1存在10的下標0里,依此類推
#if 0
void SelectSort(int x[],int n)
{
int i,j,k,t;
for(i=0;i {
k=i; //外循環(huán)一個數(shù)的下標暫存在變量k
for(j=i+1;j {
if(x[j]》x[k]) k=j;
}
if(k!=i) //內(nèi)循環(huán)循環(huán)一次,如果有比外循環(huán)大的數(shù)就交換數(shù)組元素的值
{
t=x[i]; //t為中間變量
x[i]=x[k];
x[k]=t;
}
}
}
#endif
//冒泡排序原則,重者在下,輕者在上
#if 0
void BubbleSort(int x[],int n)
{
int i,j,temp;
bit bexchange; //x0 x1 x2 x3.。.x(n-1)
for(i=1;i {
bexchange=0;
for(j=n-1;j》=i;j--)
{
if(x[j+1] 《 x[j])
{
temp = x[j+1];
x[j+1] = x[j];
x[j] = temp;
bexchange = 1;
}
// if(!bexchange) return;
}
}
}
void main(void)
{
while(1)
{
if(!bflag)
{
int *p,i,a[10]={3,7,9,11,0,6,22,5,4,2};
ser_init();
printf(”The original array:n“);
for(i=0;i《10;i++) printf(”%d,“,a[i]);
printf(”n“);
p=a;
// SelectSort(p,10);
BubbleSort(p,10);
for(i=0;i《10;i++)
{
printf(”%d “,*p);
p++;
}
printf(”n“);
bflag = 1;
}
}
}
#endif
//----------------------------------------------------------------------------------
//指向二維數(shù)組的指針變量
#if 0
void main(void)
{
while(1)
{
if(!bflag)
{
int a[3][4]={
0,1,2,3,
4,5,6,7,
8,9,10,11
};
int i,j;
int (*p)[4]; //定義指向二維數(shù)組指針變量
ser_init();
p = a; //數(shù)組a的首行地址賦給二維數(shù)組指針變量p
for(i=0;i《3;i++)
{
for(j=0;j《4;j++)
{
printf(”%d “,*(*(p+i)+j) );
}
printf(”n“);
}
bflag = 1;
}
}
}
#endif
//-------------------------------------------------------------------------------------
//字符指針變量
#if 0
void main(void)
{
while(1)
{
if(!bflag)
{
char *ps=”I Love China!“;
int n=10;
ser_init();
printf(”%s“,ps);
bflag = 1;
}
}
}
#endif
//--------------------------------------------------------------------------------------------
評論
查看更多