《征服指针》学习笔记

NoteBook

函数指针

函数可以在表达式中被解读为 “指向函数的指针”

  • 声明

    为什么普遍写法是int *a, 而非int* a ? 由于C语言混乱的声明规则,可能会露出以下破绽:

    /*声明两个“指向int的指针”? ——其实不是*/
    int* a,b;   
    

    事实上,b不是指针

  • 声明一个函数指针:

    int func(double d);   //函数原型
    int (*func_p)(double) //函数指针
    
  • 使用函数指针调用函数

    func_p = func;
    func_p(0.5);   //等同于func(0.5)
    

    对“指向函数的指针”使用*(解引用)运算符发挥不了任何作用,下面两式等价

    func_p(0.5)
    *func_p(0.5)
    
  • 使用指向函数的指针的数组

    int (*func_table[])(double)
    {
        func0,func1,func2
    };
    
    func_table[i](0.5)  //定义好各个函数,就不用写很长的switch case
    

调试函数

替代printf

使用方法:

 //注意有两个括号包裹
 DEBUG_WRITE(("%d.This is a test",i));  //i=1

代码:

 #include <stdio.h>    //vfprintf
 #include <stdarg.h>   //debug_write
 
 #define DEBUG 1 //不需要调试输出时就#define DEBUG 0
 
 #if DEBUG 
     #define DEBUG_WRITE(arg) debug_write arg
 #else
     #define DEBUG_WRITE(arg) 
 #endif
 
 void debug_write(char *fmt,...)
 {
     va_list ap;
     va_start(ap,fmt);    
     vfprintf(stderr,fmt,ap);  
     va_end(ap);
 }

函数形参

  • 对于函数的形参,最外层的数组会被解读成指针,即使定义了元素的数量也会被无视

    “最外层的数组”:如int a[][5],最外层就是a[],它被解释为指针,等同于int (*a)[5].

    即a为指向int数组(5个元素)的指针

  • 最外层数组的元素可以省略,如int a[][5]={1,2,3,4,5}; int b[]={5,4,3,2,1};

  • 只有在声明函数形参的时候,数组的声明才能被解读为指针

    错误示例1:a[]不等于*a 
        int a[100];    //1.c中定义
    	extern int *a; //2.c中声明
    
    错误示例2:str[]不等于*str
        char str[4];
    	str="abc";
    
    错误示例3*str不等于str[]
        char *str="abc";
    	str[0]='b';
    

    定义一个字符串,二者等价

    char str[]="abc"
    char str[]={'a','b','c','\0'};
    

    不要随意对指针进行强制类型转换,除了(void*)

  • 一些概念理解上的误区纠正

    1.数组和指针是两个不同的事物

    2.C语言中没有真正的多维数组,所谓的二维数组只是“数组的数组”

  • 书内知识点

    1.在scanf()中使用double,必须指定%lf

  • 在 C 语言中,main 函数是程序的入口点。main 函数可以有两个参数:argcargv

    • argc:

      它告诉程序运行时有多少个命令行参数被传递给程序。至少有一个参数,即程序的名称(通常是可执行文件的名称)。

    • argv:

      数组指针,包含了传递给程序的命令行参数,其中 argv[0] 是程序的名称,argv[1]argv[argc-1] 是实际的命令行参数。


微信公众号

关注博主微信公众号:灵萧宝殿
分享更多有趣有料内容
点此扫码

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值