指针
在C语言的学习中,我们在很多地方都会用到指针,但指针到底是怎样一个概念,下面通过一个例子来说明
#include<stdio.h>
#include<Windows.h>
int main()
{
int a = 10;
int *p = &a;
printf("%d\n",p);
system("pause");
return 0;
}
总结:指针就是变量,用来存放地址。指针的大小在32位平台是4个字节,在64位平台是8个字节。
二级指针(指针的指针)
![](https://i-blog.csdnimg.cn/blog_migrate/a64a40ee54a246d8b2b703024a6f58b6.png)
如上图所示a的地址存放在pa中,pa的地址存放在ppa中。pa是一级指针,而ppa是二级指针。
指针数组
指针数组,是一个
数组,里面每个元素是
指针。
int *p[10];
这是一个指针数组,数组名为p,元素类型为int*,也就是说数组的每个元素是整型指针类型。
![](https://i-blog.csdnimg.cn/blog_migrate/4f4350c5969a169f6d34433e25dbaf77.png)
数组指针
数组指针,它首先是是个
指针,它指向一个
数组。
int (*p)[10];
p先和*结合,说明p是一个指针变量,然后p指向一个元素个数为10的数组。
函数指针
我们来看一段代码
#include<stdio.h>
#include<Windows.h>
void test()
{
printf("hello\n");
}
int main()
{
printf("%p\n",test);//函数的地址
printf("%p\n",&test);//函数名的地址
system("pause");
return 0;
}
运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/014e0f9a72e9d2ba10abc77608441beb.png)
发现两个地址一样,说明函数名和&函数名是一样的地址。
那么函数的地址是怎样保存的?
首先存储地址,要求是一个指针类型,那么我们可以这样来写代码
void (*p)();//p先和*结合,说明p是一个指针,指向的是一个函数
看两个有趣的代码:
(*(void(*)())0)();//代码1
void(*signal(int, void(*)(int)))(int);//代码2
代码1:
1.void(*)( )是一个函数指针类型,没有参数,没有返回值;
2.把常数0强制转化为返回值为void的函数的指针类型;
3.对0这个函数指针类型解引用得到函数;
使用typedef表述为:
typedef void (*funcptr)();
(*(funcptr)0)();
代码2:
1.signal是个函数;
2.signal有两个参数,第一个为int类型,第二个为函数指针,该指针指向的函数
3.signal函数的返回类型是一个函数指针类型,该指针指向的函数有一个整形参数,参数返回为void
函数指针数组
函数指针数组,就是存放函数地址的
数组。
int((*p[10])();//p先和[]结合,说明p是数组,数组的元素类型是函数指针类型:int(*)()
用途:
转移表
例(计算器)
#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 div(int a, int b)
{
return a / b;
}
int main()
{
int x = 0;
int y = 0;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div };
while (input)
{
printf(" ***************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf(" ***************\n");
printf("请选择:");
scanf("%d", &input);
if ((input<5 && input>0))
{
printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
{
printf("输入有误\n");
}
printf("ret=%d\n", ret);
system("pause");
return 0;
}
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/250fb86af9667615ca74f305c1c453f2.png)
指向函数指针数组的指针
它首先是一个指针,该指针指向一个数组,这个数组里面的元素都是函数指针。
* char ( * ( * a)[4])(char *p) ; //这个指针指向元素个数为4的数组,这个数组里面存的是指向函数的指针,这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。