函数传递的参数类型


传值(不改变实参的值)

  • 数值(整型、浮点型、字符) 作为参数(传数)
code
#include 
void func(int i);
int main(){
	int num = 100; 
	func(num);//num实参 
    printf("%d\n",num);//100 
	return 0;
}
void func(int i){//i形参 
	i = 200; 
}
  • 结构  作为参数(传结构)
code
#include 
struct Book{
   int id;
};
void func( struct Book book2 );
int main( ){
   struct Book book1;
   book1.id = 100;
   func( book1 );//传的是值,不是引用,不能改变其值 
   printf("%d\n",book1.id); //100
   return 0;
}
void func( struct Book book2 ){
   book2.id = 200;
}

传引用(改变实参的值)

  • 数值指针(整型、浮点型、字符)作为参数(传数)
code
#include 
void func(int *i);
int main(){
	int num = 100; 
	func(&num);//num实参 
    printf("%d\n",num);//200 
	return 0;
}
void func(int *i){//i形参 
	*i = 200; 
}
  • 数组名==指向数组的指针  作为参数(传数组)
code
#include 
void func(int i[]);//方式1 
//void func(int *i);//方式2 
int main(){
	int num[3] = {111,222,333}; 
	func(num);//num实参 
    printf("%d\n",num[1]);//666
	return 0;
}

//void func(int i[])
void func(int *i)
{//i形参 
	 i[1]=666;
}
  • 指向结构体的指针  作为参数(传结构体)
code
#include 
struct Book{
   int id;
};
void func( struct Book *book2 );
int main( ){
   struct Book book1;
   book1.id = 100;
   func( &book1 );//传的是值,不是引用,不能改变其值 
   printf("%d\n",book1.id); //200
   return 0;
}
void func( struct Book *book2 ){
   book2->id = 200;
}
  • 函数名作为参数(传函数)
code
#include 
void func(int n,void (* add)(int i));
void add_1(int i);//数值加1 
void add_2(int i);//数值加2 
int main(){
	int num = 100; 
	//func(num,add_2);//方式1 
	func(num,&add_2);// 方式2 
	return 0;
}
void func(int n,void (* add)(int i)){ 
	 // 会执行add_2 
	 //(*add)(n);//方式1
	 add(n);//方式1
} 
void add_1(int i){
	i += 1;
	printf("执行的是add_1函数,数值变为%d\n",i);//101 
} 
void add_2(int i){
	i += 2;
	printf("执行的是add_2函数,数值变为%d\n",i);//102 
}