指针杂货2(自用)

指针杂货2(自用),第1张

指针作为函数参数

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;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/569784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存