【扩展知识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.net和http://blog.csdn.net/mirrorsbeyourself