【扩展知识5】大战函数的参数

【扩展知识4】大战函数的参数

 

扩展目录:

1.        变量

2.        指针

3.        数组

4.        结构体

 

函数数参数可以分为形参和实参。形参是指声明或定义函数时的参数,而实参是在调用函数时主调用函数传递过来的实际参数。

参数可以分为,普通变量参数、指针参数和数组参数。普通变量参数是通过传递值,而数组和指针参数是通过传递地址。

 

( 1 )普通变量参数:仅仅传递值

#include <stdio.h>
 
//swap函数的定义
//a和b都是普通变量参数,实参与形参通过值传递
//功能:交换a和b的值(但,此函数不能实现!!!)
void swap( int a, int b )
{
         inttemp;  
        
         temp=a;
         a=b;
         b=temp;
        
         return;
}
int main( void )
{
         intn= 10;
         intm= 20;
        
         printf("调用swap函数前: n= %d, n= %d\n", n, m );
        
         //使用值传递
         swap(n, m );
        
         printf("调用swap函数后: n= %d, n= %d\n", n, m );
        
         return0;
}


运行结果:

调用swap函数前: n= 10, m= 20

调用swap函数后: n= 10, m= 20

说明:有运行结果可知,值传递只能传递值给函数,但不能改变实参。

 

( 2 )指针参数:传递首地址

 


运行结果:

调用swap函数前: n= 10, m= 20

调用swap函数后: n= 20, m= 10

说明: 指针参数是通过传递地址,可以改变实参的值。

 

( 3 )数组参数:

数组作为参数时,编译器总是把它解析为一个指向数组首地址的指针。

[程序1]

//
#include <stdio.h>
 
void print( int array[], int n )
{
         inti= 0;
        
         for(i= 0; i< n; i++ )
         {
                   printf("%d ", array[ i ] );
         }
        
         putchar(10 );  //printf("\n");
        
         return;
}
int main( void )
{
         intarray[]= { 1, 3, 0 ,4, 5, 6, 7, 98, 90 };
         intnum= 0;
        
         //求数组个数(不懂的可以看博客上的【扩展知识2】)
         num=sizeof( array )/ sizeof( array[ 0 ] );
        
         print(array, num );
        
   return 0; 
}


 

运行结果:

1 3 0 4 5 67 98 90

 

[程序 2]

//
#include <stdio.h>
 
void print( int array[] )
{
         inti= 0;
         intnum= 0;
        
         //求数组个数(不懂的可以看博客上的【扩展知识2】)
         num=sizeof( array )/ sizeof( array[ 0 ] );
        
         for(i= 0; i< num; i++ )
         {
                   printf("%d ", array[ i ] );
         }
        
         putchar(10 );  //printf("\n");
        
         return;
}
int main( void )
{
         intarray[]= { 1, 3, 0 ,4, 5, 6, 7, 98, 90 };
        
         print(array );
        
   return 0; 
}


运行结果:

1

 

说明:有以上两个程序得出,数组作为参数时,编译器总是把它解析为一个指向数组首地址的指针。所以我们不能使用sizeof去求数组参数(指针参数也是不允许的)的个数。

 

(4 )多级指针和多位数组也可以作为参数使用

 只给程序实例:(这和上面讲的相同)

#include <stdio.h>
 
//二维数组array作为参数时必须写第二个数,即m的值
//数组array有n*m个元素其中n为行数,m为每行的个数
void print( int array[][3], int n, int m )
{
         inti= 0;
         intj= 0;
        
         for(i= 0; i< n; i++ )
         {
                   for(j= 0; j< m; j++ )
                   {
                            printf("%d ", array [i ][ j ] );
                   }
                   putchar(10 );
         }
        
         return;
}
 
int main( void )
{
         intnum= 0;
         intarray[ ][3] = { 10, 20, 30, 40, 50, 60 };
                          /* 如下排列
                                                {
                              10, 20, 30,
                                                         40, 50, 60
                                                 };
                                                 */
   //求数组的元素个数:
         num=sizeof( array )/ sizeof( array[ 0 ][ 0 ] );
        
         print(array, num/ 3, 3 );
          
         return0;
}
 


运行结果:

10 20 30

40 50 60

 

( 5 )结构体参数

  

//结构体参数和其他参数一样,结构体只不过是一种自定义的类型而已
#include <stdio.h>
 
struct student
{
         intnumber;        //编号
         charname[ 15 ];   //姓名
};
 
//print函数的声明
void print( struct student *ptr ); //结构体指针变量
 
 
int main( void )
{
         structstudent stu[ 2 ]= {  //定义结构体变量stu,并初始化
                                       201, "张三",
                                       202, "李四"
                             };
         //调用print函数,通过值传递                   
         print(stu );
        
          
         return0;
}
 
 
//print函数的定义
void print( struct student *ptr )
{
         inti= 0;
         printf("%s %6s\n", "编号", "姓名" );
          
         for(i= 0; i< 2; i++ )
         {
             printf( "%d  %6s\n", ptr->number, ptr->name );
                  
                   ptr++;  //先后移动一个
         }
        
         return;
}

【指尖的微笑】错误在所难免,希望得到大家的指正^-^

转载时保留原文的链接http://oursharingclub.joinbbs.nethttp://blog.csdn.net/mirrorsbeyourself

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值