指针的用法


前言

C语言是人与计算机交流的一种语言,它既有高级语言的特点,又具有汇编语言的特点。C语言引入指针是它显著优点之一,善于利用指针可以提高程序效率,用程序更加简洁,高效。这也是为什么说指针是C语言的灵魂。下面汇总一些指针具体点用法。


一、指针是什么?

内存是由一个又一个的字节组成的,每一个字节对应一个地址编号。在程序中定义一个整形变量a,系统就会给程序分配四个字节大小的内存空间,每一个字节会有一个相对应的地址编号,通过首地址编号就可以找到这个整形变量a,可以说,这个首地址就是指向这个整形变量,所以将地址形象化的称为“指针”。

二、指针变量

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 10;//定义一个整形变量a
	int* pa = &a;//将a的地址存放到指针变量pa中
	printf("%d\n", *pa);
	return 0;
}

程序运行结果:

在这里插入图片描述
指针变量pa,里面存放的是整形变量a的地址。

在这里插入图片描述

三.指针数组

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int i = 0;
	int* parr[2] = { &a,&b };//将整形变量a和b的地址存放到指针数组parr中
	for (i = 0; i < 2; i++)
	{
		printf("%d ", *(parr[i]));
	}
	return 0;
}

程序运行结果:
在这里插入图片描述

指针数组parr本质上是一个数组,这个数组存放了两个元素,每个元素中又存放了一个整形变量的地址。

在这里插入图片描述

四、数组指针

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[2] = {10,20};//定义一维数组
	int(*p)[2] = &arr;//将数组地址赋给指针变量p
	int i = 0;
	for (i = 0; i < 2; i++)
	{
		//printf("%d ", (*p)[i]);
		//printf("%d ", *(*p+i));
		//printf("%d ", arr[i]);//*p==arr
		printf("%d ", *(arr+i));
	}
	return 0;
}

程序运行结果:
在这里插入图片描述
数组指针p本质上是一个指针,里面存放的是arr数组中所有元素的地址,这个数组有两个元素,每个元素中存放的是一个int类型的数值。

在这里插入图片描述

五、函数指针

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int x, int y)//定义一个Add函数
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int (*p)(int, int) = Add;//将函数地址Add赋给指针变量p
	printf("%d\n", (*p)(a, b));
	return 0;
}

程序运行结果:
在这里插入图片描述
函数指针本质上是一个指针,这个指针变量里面存放的是一个函数的地址。

在这里插入图片描述

六、函数指针数组

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int x, int y)//定义Add函数
{
	return x + y;
}
int Sub(int x, int y)//定义Sub函数
{
	return x - y;
}
int main()
{
	int a = 10;
	int b = 20;
	int i = 0;
	int (*parr[2])(int, int) = { Add,Sub };//将Add和Sub函数地址赋给函数指针数组parr
	for (i = 0; i < 2; i++)
	{
		printf("%d ", (*parr[i])(a, b));
	}
	return 0;
}

程序运行结果:
在这里插入图片描述

函数指针数组本质上是一个数组,数组里面存放两个元素,每个元素中又存放了一个函数的地址。
在这里插入图片描述

七、指向函数指针数组的指针

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int x, int y)//定义Add函数
{
	return x + y;
}
int Sub(int x, int y)//定义Sub函数
{
	return x - y;
}
int main()
{
	int a = 10;
	int b = 20;
	int i = 0;
	int (*parr[2])(int, int) = { Add,Sub };//函数指针数组
	int (*(*p)[2])(int,int) = &parr;//指向函数指针数组的指针
	for (i = 0; i < 2; i++)
	{
		printf("%d ", (*pparr)[i](a, b));
	}
	return 0;
}

程序运行结果:
在这里插入图片描述
p是一个指针变量,这是一个指向函数指针数组的指针,意思是这个指针里面存放的是函数指针数组的地址,这个数组又有两个元素,每个元素中存放的又是一个函数的地址。

在这里插入图片描述

总结

指针功能强大,同时它的使用方法也有很多种,所以理清各个用法是指针学习必不可少的一部分。

  • 14
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值