C语言指针详解

指针变量

类似于 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))

至于二级多级指针,下次再讨论....

猜你喜欢

转载自blog.csdn.net/qq_33413868/article/details/80769554