深入理解指针机制

深入理解指针及指针相关内容
  1.什么是指针:指针是编程语言中的一个对象,利用地址,他的指直接指向存在电脑存储器中另一个地方的值,由于能够通过地址找到所需的变量单元,可以说地址指向变量单元,因此我们可以说:指针就是地址,通过指针可以找到以它为地址的内存单元


  指针是存放地址才出现的,地址是为了表示一块地址空间的,相当于我们给多个完全相同的房间贴上门牌号,来进行区分,方便我们查找


  指针让地址有地方存放,指针让内存的访问更加的方便


  指针的大小在32位平台下是4个字节,64位平台上是8个字节


  我们都知道变量是有类型的,那么指针也是有类型的,指针的类型就是;type + *的方式


  不同类型的指针就是为了存放相对应的类型的变量的地址,例如:char *类型的指针就是为了存放char类型的变量的地址,int *类型的指针就是为了存放int类型的变量的地址


  因为指针是有类型的所以当我们在进行指针的加减运算时对指针的加减一其实是对其所指向类型的大小进行加减。


  指向同一个数组的两个指针相减(前提是类型相同)代表的就是两指针之间经历的元素个数,元素的类型有相减的指针类型决定


  允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较


  对指针解引用就是他所指向的目标变量

  指针变量是变量,开辟的空间里放的是指针。
  变量指针就是变量地址






1.理解函数指针和定义 
  函数指针变量:保存函数地址的变量
  函数名通常代表了函数的地址,函数指针是用来保存函数地址的。
  例如:void (*pfun1)()  函数指针
  函数指针不同于函数的声明: void *pfun2() 为 函数的声明
  代码举例:



程序运行完毕后输出的结果为:


可以看到输出的结果相同,也就是说函数名其实就是函数的地址


函数指针在程序中的调用:
Void (*test) ()当在函数中输出函数指针时,输出的是函数的地址,且与&test相同,说明了:函数指针是用来保存函数的地址的。


2.理解函数指针数组和定义,转移表 
   数组是一个存放相同类型的数据的存储空间,把函数的地址存放到一个数组中,把这个数组就叫做函数指针数组(那我们根据指针的定义,我们是不是可以称他为函数地址数组呢?这样更加的便于我们的理解,当然这只能是我们的书面语言)。
  函数指针数组的定义: int (*p[10])()      p先和[]结合,说明p是一个数组,数组内容是int (*)()类型的函数指针




转移表:
代码示例: #include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)


int add(int x, int y){

return (x + y);
}
int sub(int a, int b){
return a - b;
}
int mul(int a, int b){
return a*b;
}
int  div2(int a, int b){
return a / b;
}
int main(){


int ret=0;
int input = 1;

int(*p[5])(int x, int y) = { 0, add, sub, mul, div2 };
while (input){
printf("*****************************\n");
printf("1.add   2.sub   3.mul   4.div\n");
printf("*****************************\n");
printf("请选择:\n");
int select;
scanf("%d", &select);
if ((select >= 1) && (select <= 4)){
printf("请输入需要操作的数字:\n");
int x, y;
scanf("%d%d", &x, &y);
int ret = p[select](x, y);
printf("%d", ret);
break;

}
else{
printf("输入的选择错误!\n");
printf("%d\n", ret);
}
}
system("pause");
return 0;
}


3.理解指向函数指针数组的指针和定义指向函数指针数组的指针:
     指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针。
定义方式:
  void (*(*p)[10])(const char*)
  顺序:定义一个函数指针,*p
函数指针的数组*p[10]
函数指针的数组的指针:(*(*p)[10])


 
4.理解回调函数的使用 
回调函数是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用指向其所指的函数的时候,我们就说这是回调函数。回调函数不是该函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用的,用于对该事件或条件进行响应。


 

猜你喜欢

转载自blog.csdn.net/sd116460/article/details/80443547