指针
指针可以理解为:当你要和一个人说话的时候,你要先找到他的位置,然后你才能和他说话,这个位置就可以理解为指针变量。
int * p = a;
p存的就是a的地址;
指针数组:数组元素为指针类型的数组
int arr [5];//这是一个整数数组
float arr [5];//这是一个浮点型数组
同样int* arr[5];//这是一个每一个元素为int*类型的指针数组,即每一个元素都是一个整形元素的地址,就是指针数组
数组指针:数组指针是指向数组的指针;、
对于一维数组:
int arr[4] = {1, 2, 3, 4};
int (*p)= arr;
对于以上代码,*(p + 0)的值为1, *(p+1)的值为2,*(p + 2)的值为3, *(p+3)的值为4;
因为arr的值等于&arr,即数组的地址等于数组首元素的地址,则p指向的其实是数组第一个元素;
对于二维数组:数组指针指向的是每一行的起始地址;
int arr[4][4] = {11, 12, 13, 14,
21, 22, 23, 24,
31, 32, 33, 34,
41, 42, 43, 44};
int (*p)[4] = &arr;
p指向的是第一行第一个元素;
所以*(*(p[0]) + 0))的值为11,*(*(p[0]) + 1))的值为12,*(p[2]) 指向的是第三列第一个元素
以此类推:
对于三维数组数组:指针指向的是每一个二维数组的起始地址
函数指针 :
函数指针:指向函数的指针,每个函数也有地址,用一个指针变量把这个地址取出,这个指针就叫函数指针;
#include<stdio.h>
void fun(int x)
{
printf("%d", x);
}
int main()
{
void (*p)(int) = fun;
p(5);
return 0;
}
上述代码的结果为5,指针变量p就是指向一个函数的指针变量,在声明一个函数指针变量时,返回类型和参数列表的类型必须和所指向的函数一致
使用函数指针的作用:
实现多态;
回调函数;
函数指针数组 :数组元素为函数指针的数组
void (*p[2])(int) = {fun1, fun2};
p[0](arg);//调用第一个函数;
p[1](arg);//调用第二个函数;
函数指针数组里面的函数返回类型和参数列表必须一致。
指向函数指针数组的指针 :声明一个指针变量指向的是一个函数指针数组,当然这个指针类型必须为函数指针类型;