浅谈指针相关知识

指针

在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个字节。

二级指针(指针的指针

如上图所示a的地址存放在pa中,pa的地址存放在ppa中。pa是一级指针,而ppa是二级指针。

指针数组


指针数组,是一个 数组,里面每个元素是 指针
int *p[10];
这是一个指针数组,数组名为p,元素类型为int*,也就是说数组的每个元素是整型指针类型。

数组指针

数组指针,它首先是是个 指针,它指向一个 数组
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;
}

运行结果
发现两个地址一样,说明函数名和&函数名是一样的地址。
那么函数的地址是怎样保存的?
首先存储地址,要求是一个指针类型,那么我们可以这样来写代码
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;
	}
}
   

运行结果:

指向函数指针数组的指针

它首先是一个指针,该指针指向一个数组,这个数组里面的元素都是函数指针。
* char ( * ( * a)[4])(char *p) ; //这个指针指向元素个数为4的数组,这个数组里面存的是指向函数的指针,这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。


 









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值