第六章 指针
1.数组指针
定义一个指针,指向一个二维数组
a)为什么定义数组指针?
在二维数组中,行地址的偏移与列地址的偏移是不一样的。
若直接定义指针指向二维数组a,程序警告:类型不匹配,存在隐患
b)能不能定义一个指针,让指针偏移的长度对应数组的偏移长度?并使用数组指针打印数组?
注意:数组指针才是真正等同于二维数组名
int (*q)[4]; q=a;//指针指向行数组
数组a++偏移长度为16字节,结合上图,输出地址偏移也是16字节。
2.函数指针
如果程序定义一个函数,编译时,系统会为函数分配一段存储空间,这段存储空间的起始地址称为函数的指针。
函数名就是函数的地址
a)如何定义一个函数指针? 已知int getData(int a,int b) 定义函数指针int (*p)(int a,int b) p=getData //将函数地址传给p
b)如何调用函数? 1)直接调用函数名 2)通过函数指针调用
练习:函数指针的应用,类似于java接口
函数内包含多个函数,通过函数指针调用某个函数
3.指针数组
一个数组,若每个元素都为指针类型,每个元素存放一个地址,称为指针数组。 int * p[4];
结果:
练习:将多个函数封装到数组内,使用指针数组调用
注意:第31行处,函数指针-->指针数组,后面需要带上调用函数中的函数名(地址),否则程序空跑无输出。
4.指针函数
一个函数的返回值可以是整型,浮点型等,也可以是指针型数据(即地址)
int * a(int x,int y); 函数名为a,调用该函数,返回一个int型的指针,(即int型的地址)
int *p与int* p的区别?
int *p //定义一个指针变量 int* p//定义一个变量,它的类型是指针
练习:有a名同学,每个同学有b门成绩,要求输入学生学号,打印出所有成绩,使用指针函数实现