理解指针

高级指针

(1)指针数组

简单来说就是存放指针的一个数组,是数组

例如  int*arr[10]

 理解指针

(2)数组指针

就是指向数组的一个指针,是指针,例如*p ,int(*p)[10]

 理解指针

写了一段简单代码

int main()

{

int arr[10] = { 0 };

int(*p)[10] = &arr;

system("pause");

return 0;

}

&arr

 理解指针

p内容

 理解指针

p存放的是数组地址。

(3)函数指针

任何函数都是有地址的,自然也会有存放函数地址的指针,就是函数指针

函数名代表函数地址,证明如下:

 理解指针

 

(4)函数指针数组

先在字面上理解一下,存放函数指针的一个数组,也就是存放函数地址的数组,是数组。

int (*p[20])();

计算器的实现就是函数指针数组的实例

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include<windows.h>

int add(int a, int b)

{

return a + b;

}

int sub(int a, int b)

{

return a - b;

}

int mul(int a, int b)

{

return a * b;

}

int divi(int a, int b)

{

return a / b;

}

void menu()

{

printf("---------------------------------\n");

printf("------1.add         2.sub------\n ");

printf("------3.mul         4.div------\n ");

printf("---------------------------------\n");

printf("请选择:");

}

int main()

{

int x = 0;

int y = 0;

int input = 1;

int ret = 0;

char a[5] = { '0', '+', '-', '*', '/' };

int(*p[5])(int x, int y) = { 0, add, sub, mul, divi };  //定义一个函数指针数组存放函数地址

while (input)

{

menu();

scanf("%d", &input);

if (input == 0)break;

if (input > 0 && input < 5)

{

printf("请输入操作数:");

scanf("%d %d", &x, &y);

ret = (*p[input])(x, y);

 

}

else{

printf("输入错误!\n");

}

printf("%d %c %d = %d\n", x, a[input], y, ret);

}

system("pause");

return 0;

}

(5)指向函数指针数组的指针

这个指针指向一个函数指针数组,指针存放的内容是函数指针数组的地址,是指针。

Void(**p[10])()