C语言中实参和形参的传递仅仅是值传递
但是可以改变实参指针变量所指向变量的值
比如实参是一个数组a[10]
形参是一个指针变量p,p指向数组a的首地址
进入子函数时,不在为指针型的形参所指的数组开辟地址,而是直接用已经定义过的那个数组的地址。
举个栗子
#include
#include
#include
//验证形参指针变量可以改变实参指针变量(这个指针变量可以是个数组地址)所指变量的值
int main()
{
//思路:
void back_num(int *p);
int a[5]={1,2,3,4,5};
int *ptr=a;
int i=5;
while(i--)
{
printf("%d ",*ptr++);
// printf("%d ",*a+i);
//printf("%d",*a++);经典错误,这里a是数组地址,不是变量不能自加
//如果想用可以利用一个变量,让a+这个变量
//例如a+i 输出5 4 3 2 1
}
printf("\n");
back_num(a);
ptr=a;//把a的首地址重新赋给指针ptr
i=5;
while(i--)
{
printf("%d ",*ptr++);
}
return 0;//今天又是没带return 0的一天
}
void back_num(int *p)
{
int i=5;
while(i--)
{
scanf("%d",p++);//改变形参所指变量的值,验证实参所指的变量值是否会改变
}
}
把刚刚有个重要的地方再拿出来说一下
数组的地址不能自增,而指向数组地址的指针变量可以自增
栗子
int a[10];a++;这是经典错误。 可以int *p=a;p++;这样可以用。
在codeblocks里面报的错误是下面这个
D:\lessoncc\lesson1\lesson.c|13|error: lvalue required as increment operand|
指向函数的指针
给个用法的栗子
#include
#include
#include
//
int main()
{
//思路:
int add_num(int x,int y);
int dc_num(int x,int y);
void results(int (* fp1)(),int x,int y);//这里告诫大家,
//每写一句话都要加分号,我定义函数的时候没加分号,找了有20分钟没找到错在哪。
int (*fp)();
fp=add_num; //有了这个fp就相当于进入了add_num这个函数首地址
// printf("%d ",results(fp,1,1));
results(fp,1,1);
fp=dc_num;
results(fp,1,1);
// printf("%d ",results(fp,1,1));
return 0;//今天又是没带return 0的一天
}
int add_num(int x,int y)
{
return x+y;
}
int dc_num(int x,int y)
{
return x-y;
}
void results(int (*fp1)(),int x,int y)
{
int value;
value=(*fp1)(x,y);
printf("%d ",value);
}
用指向函数的指针变量,可以把函数的入口地址赋给它,可以直接代替函数名
这里再提一次指向函数的指针像这样定义
int (*fp)();//int 表返回值为整型,fp是指向函数的指针名
int add(int x,int y);
fp=add;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)