1. 指针作为函数的参数

咱们可以给一个函数传一个 整型、字符型、浮点型的数据,也可以给函数传一个地址。

例:

int num;

scanf("%d",&num);

函数传参:

(1)、传数值:

例 22:
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
int main()
{
int a=10,b=20;
swap(a,b);
printf("a=%d b=%d\n",a,b);//a=10 b=20
}

实参:调用函数时传的参数。

形参:定义被调函数时,函数名后边括号里的数据

结论:给被调函数传数值,只能改变被调函数形参的值,不能改变主调函数实参的值

(2)、传地址:

例 23:
void swap(int *p1,int *p2)
{
int temp;
temp= *p1;
*p1=*p2;// p2 指向的变量的值,给 p1 指向的变量赋值
*p2=temp;
}
int main()
{
int a=10,b=20;
swap(&a,&b);
printf("a=%d b=%d\n",a,b);//结果为 a=20 b=10
}

结论:调用函数的时候传变量的地址,在被调函数中通过*+地址来改变主调函数中的变量的值

例 24:
void swap(int *p1,int *p2)//&a &b
{
int *p;
p=p1;
p1=p2;//p1 =&b 让 p1 指向 main 中的 b
p2=p;//让 p2 指向 main 函数中 a
}//此函数中改变的是 p1 和 p2 的指向,并没有给 main 中的 a 和 b 赋值
int main()
{
int a=10,b=20;
swap(&a,&b);
printf("a=%d b=%d\n",a,b);//结果为 a=10 b=20
}

总结:要想改变主调函数中变量的值,必须传变量的地址, 而且还得通过*+地址 去赋值

例 25:
void fun(char *p)
{
p="hello kitty";
}
int main()
{
char *p="hello world";
fun(p);
printf("%s\n",p);//结果为: hello world
}

答案分析: 在 fun 中改变的是 fun 函数中的局部变量 p,并没有改变 main 函数中的变量 p,所以 main 函数中的, 变量 p 还是指向 hello

例 26:
void fun(char **q)
{
*q="hello kitty";
}
int main()
{
char *p="hello world";
fun(&p);
printf("%s\n",p);//结果为:hello kitty
}
总结一句话:要想改变主调函数中变量的值,必须传变量的地址,而且还得通过*+地址 去赋值。无
论这个变量是什么类型的。

(3) 给函数传数组:

给函数传数组的时候,没法一下将数组的内容作为整体传进去。 只能传数组名进去,数组名就是数组的首地址,即只能把数组的地址传进去。 也就是说,只能传一个 4 个字节大小的地址编号进去

例 27:传一维数组的地址

//void fun(int p[])//形式 1
void fun(int *p)//形式 2
{
printf("%d\n",p[2]);
printf("%d\n",*(p+3));
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8};
fun(a);
return 0;
}

例 28:传二维数组的地址

//void fun( int p[][4] )//形式 1
void fun( int (*p)[4] )//形式 2
{
}
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
fun(a);
return 0;
}

例 29:传指针数组

void fun(char **q) // char *q[]
{
int i;
for(i=0;i<3;i++)
printf("%s\n",q[i]);
}
int main()
{
char *p[3]={"hello","world","kitty"}; //p[0] p[1] p[2] char *
fun(p);
return 0;
}

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_69748833/article/details/131731251