一、知识点梳理
char *p="hello"; p=NULL; //不用时置为零,避免野指针
- 声明函数指针
int sum(int a,int b)
{
return a+b;
}
int (* pfun)(int,int)=sum; //函数指针声明
//函数返回值类型 (函数形参类型)
四种函数指针调用方法:
printf("%d\n",sum(1,2));
printf("%d\n",pfun(1,2));
printf("%d\n",(*sum)(1,2));
printf("%d\n",(*pfun)(1,2));
- 回调函数:下层函数调动上层函数
- 其它类型指针指向void *需要强制类型转换
char (p1)[5] = (char ()[5])a; //把前边复制到后边括号中并把函数名删去
5.int **p; //二级指针
(1)用于指向一级指针`
int a=10;
int *q=&a;
p=&q;
//a=*q=**p
//&a==q==*p
(2)p可以指向对应的(类型相同)指针数组
int *b[20];
p=b;
// p+2 b[2]指向的int *的首地址
//*p+2 b[0]指向的数组的第三个元素的地址
//**p b[0]指向的数组的第1个元素的值
- 若实参是一个指针变量p,传递给形参,则函数的内部无论怎么做,不会改变实参p的指向,形参可以通过改变地址来改变p所指向的内容。
- **的作用
(1)改变一级指针的指向,若实参是一个一级指针的地址则形参是 **;
(2)当实参为指针数组时,形参要用 **;
ps: int *a[] ===int **a - 打印main的命令行参数
#include<stdio.h>
int main(int argc,char **argv)
{
int i;
for(i=0;i<argc;i++){
printf("%s ",argv[i]);
}
printf("\n");
return 0;
}
// gcc 1.c
// ./a.out 参数一 参数二 ......
- const
const char *p;
char const *p;//两个等价,表示指针是只读指针,可以指向有效地址,可以读取,但无法通过指针修改内存
char *const p;//常量指针,一般需初始化,指向后无法指向其他地方,但可以通过指针变量修改内存
const char *const p;
char const *const p;//二者等价,只读常量指针,不能通过指针变量修改内存,不能指来指去
9.有关指针的总结
二、今日心得
学的东西越来越多,有点记不住了,十分容易混淆。而且知识点没有吃透,很多题换种提问方法就做不出来了,昨晚做的选择题有点儿惨不忍睹。这样差距只会越来越大,做一件事就要尽力做到最好,不能让努力白费。