指针变量
类似于 int *p; char *p 或者自定义类型的 Person *p; Struct *p
这些都是基本的指针变量,不管什么类型的指针变量都是一个存地址的变量,所以它们的大小都是四个字节
还有一种void *p 类型,类似于 js 或者 c# 的 var 可以传入任何类型变量的地址,也可以转换成任何类型变量的地址,这个在后面会很有用
常量指针,指针常量
首先明白:指针和指针指向的内容是两个不同的东西
常量指针 : const int *p = &a; 是一种指针,指向常量的
指针常量: int *const p = &a; 是一种常量,指针类型的常量
这张图显示的是常量指针,由于是常量的指针,所以肯定不会允许修改常量的值
常量指针意思为 指针指向的地址的变量不可修改,但是可以更改指针的指向
这张图显示的是指针常量,可以读指针的常量,它是一个常量,必须在定义的时候赋值,常量是不允许修改值的,所以指针的值不允许改变,但是指针指向的地址的值可以改变
数组指针,指针数组
int *p[10] ; 指针数组
int (*p)[10] ; 数组指针
如果你看了上面,一定会有所感悟。。
数组的指针 ............ 指针的数组 这就很好理解了
数组指针是指向数组的指针
指针数组是指针的数组,我前面说过指针也是一个变量类型,所以拿类型定义数组天经地义 int *p[]
//一个数组的指针 指向数组
int arr[10] = {0};
int(*parr)[10] = &arr;
//一个指针的数组 , 并给第一个元素赋值
int *p[10] = {0};
int a = 1;
p[0] = &a;
函数指针
直接上代码
int LongFunc(int a, char c, long l, bool b)
{
cout << "函数执行了!!" << a <<endl;
return 0;
}
typedef int FUNC(int, char, long, bool);
int main()
{
//1. 注意一定要加括号 (*p)
int (*p)(int, char, long, bool);
//2. 或者使用类型重命名来定义指针
FUNC *p2;
//3. 同样也可以使用 void * 来定义 不过使用的时候要强转一下
void *p3;
p = &LongFunc;
p2 = &LongFunc;
p3 = &LongFunc;
p(1, 1, 1, 1);
p2(2, 1, 1, 1);
((FUNC *)p3)(3, 1, 1, 1);
return 0;
}
执行结果如下
至于其他类型,如果没有返回值,
void (*p)(int, char, long, bool);
可以改成这个样子,类似的有参无参都可以
下面的是函数指针做形参,可以直接执行,使用类型重命名是最方便的
void DoOther(FUNC *f)
{
f(4, 1, 1, 1);
}
如果不使用typedef ,会看起来很复杂
void DoOther(int(*p)(int, char, long, bool))