一句话说一下结论:形参的作用是要求传入的参数类型,但与函数内部调用无关
#include <stdio.h>
void print1(int *i)
{
printf("函数print(int *i),调用print(p),i = p,传参为p,函数内使用的*i,所以函数内*i = *p = %d\n",*i);
}
void print2(int *i)
{
printf("函数print(int *i),调用print(p),i = p,传参为p,函数内使用的i,所以函数内i = p = %d\n",i);
}
void print3(int *i)
{
printf("函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的*i,所以函数内*i = * &p = p = %d\n",*i);
}
void print4(int *i)
{
printf("函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的i,所以函数内i = &p = %d\n",i);
}
void main()
{
int a;
a = 10;
int *p;
p = &a;
printf("main()中直接打印一下p 和*p作为参考:\n");
printf("p:%d\n",p);
printf("*p:%d\n",*p);
// printf("\n");
printf("接下来是函数内部调用实参p 和*p的对比:\n");
printf("先说结论,形参只是要求函数传参的类型\n");
printf("具体操作取决于函数内部的具体情况\n");
printf("与形参上的标注无关\n");
printf("以下四个例子都要求传入参数为指针类型\n");
print1(p);
print2(p);
print3(&p);
print4(&p);
}
打印结果(结论):
main()中直接打印一下p 和*p作为参考:
p:6422044
*p:10
接下来是函数内部调用实参p 和*p的对比:
先说结论,形参只是要求函数传参的类型
具体操作取决于函数内部的具体情况
与形参上的标注无关
以下四个例子都要求传入参数为指针类型
函数print(int *i),调用print(p),i = p,传参为p,函数内使用的*i,所以函数内*i = *p = 10
函数print(int *i),调用print(p),i = p,传参为p,函数内使用的i,所以函数内i = p = 6422044
函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的*i,所以函数内*i = * &p = p = 6422044
函数print(int *i),调用print(&p),i = &p,传参为&p,函数内使用的i,所以函数内i = &p = 6422032
还有个特殊的例子,形参传入的参数本身是个指针时的状况
另外留意一下(*L)->data的注释说明
#include <stdio.h>
typedef struct Integer{
int data;
}Integer;
typedef Integer *Int;
void print(Int *L)
{
printf("我是形参*L,要求传入形式为&L\n");
printf("实参传入&b时,*L = *&b,函数内部调用*L对应的值为*L = * &b = b = %d\n",*L);
printf("实参传入&b时,L = &b,函数内部调用L对应的值为L = &b = %d\n",L);
(*L)->data;/*这里要调用L的data,还是那句话,传入的参数要求是个指针,
以实参&b为例,这里我们我们想拿到b的data就要*&b,而b本身又是个指针,
所以访问b的data要用->,所以连起来就是(* &b)->data,
所以没参数传入时要写成(*L)->data*/
}
int main()
{
Int b; /*b本身是个指针变量*/
print(&b); /*在这传入的是b这个变量的地址*/
}
打印结果:
我是形参*L,要求传入形式为&L
实参传入&b时,*L = *&b,函数内部调用*L对应的值为*L = * &b = b = 16
实参传入&b时,L = &b,函数内部调用L对应的值为L = &b = 6422040