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
函数可以有两个参数:argc
和argv
。-
argc
:它告诉程序运行时有多少个命令行参数被传递给程序。至少有一个参数,即程序的名称(通常是可执行文件的名称)。
-
argv
:数组指针,包含了传递给程序的命令行参数,其中
argv[0]
是程序的名称,argv[1]
到argv[argc-1]
是实际的命令行参数。
-
微信公众号
关注博主微信公众号:灵萧宝殿
分享更多有趣有料内容
点此扫码