C语言---指针

本文详细介绍了指针的概念,包括指针的定义、种类和图解,强调了类型在指针中的作用,并通过实例展示了指针在值传递和指针传递中的应用。此外,还探讨了二级指针的概念和函数指针的使用,提供了相关代码示例,帮助理解指针的深层操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.一级指针

1.1指针定义

计算机中所有数据都必须放在内存中,为了正确访问这些内存,必须给每个字节编上号码,像门牌号,每个字节编码都是唯一的,内存中字节编号称为地址指针

  • 指针用来存放地址
  • 最小的地址:0X0000 0000
  • 最大的地址:0XFFFF FFFF
  • 程序能够使用的内存为4GB
  • 在指针定义中,*号和变量名结合

1.2指针的种类

  • 空指针
int *s=NULL;
  • 野指针
int *p;
  • 失效指针

1.3图解指针


	int a = 10, b = 20;
	int *ip = NULL;//* 声明ip是指针  空给ip
	ip = &a;//把a 的地址给ip   &*ip<=>&a
	
	*ip = 100;//a=>100
	ip = &b;//把b的地址给ip
	*ip = 200;
  • ip = &a;

在这里插入图片描述

  • ip存放谁地址,解引用就是谁本身

  • 使用指针变量首先要明确指针变量自身的值(存储的是地址),再明确指针变量所指的实体(解引用)

1.4类型对指针变量起到2个作用

1,解析存储单元的大小
2,指针变量加1的能力
在这里插入图片描述

int main()
{
	const int n = 5;
	double ar[5] = { 1.2, 2.3, 3.4, 4.5, 5.6 };
	double*p = &ar[0];
	for (int i = 0; i < n; ++i)
	{
		printf("0x%08x =>%f \n", p, *p);
		p = p + 1;//p+=1;p++;++p;

	}
}

在这里插入图片描述

1.5指针的应用

  • 值传递(形参的改变不会影响到实参的值)
void Swap_a(int a, int b)
{
	int c = a;
	a = b;
	b = c;
}
int main()
{
	int x = 10, y = 20;
	Swap_a(x, y);
	printf("%d\n%d\n", x, y);
	return 0;
}

在这里插入图片描述

  • 指针传递(实参的地址传递给形参,才会改变实参的值)
void Swap_b(int *ap,int *bp)
{
	int c = *ap;
	*ap = *bp;
	*bp = c;
}

int main()
{
	int x = 10, y = 20;
	Swap_b(&x, &y);
	printf("%d\n%d\n", x, y);
	return 0;
}

在这里插入图片描述

  • 想改变某个变量的值必须有动作(赋值)存在,

2.二级指针

如果指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针

2.1图解二级指针

假设有一个int类型变量a,p1指向a的指针变量,p2又是指向p1的指针变量,它们的关系如图:

在这里插入图片描述

代码关系:

int a = 100;
int *p1 = &a;
int *p2 = &p1;

2.2指针关系

int a = 10, b = 20;
	int *ip = &a;
	int **sp = &ip;

	int ar[10] = {}; //sizeof(ar); type+num
	ip = ar;  //ar =>&ar[0];
	
	int(*par)[10] = &ar;//type+num 存放数组的地址
	//定义par指针,开辟四个字节空间,指向大小为10,类型为int的数组

	int *pbr[10];//开辟10个空间(40个字节),每个空间是整型类型的指针

	int*(*sbr)[10] = &pbr;

3.函数指针

函数指针的本质是是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。
函数类型两部分构成:返回类型+形参列表

    int fun(int, int);//函数声明

	//函数指针
	int(*pfun)(int, int);//定义一个pfun指针指向一个参数都为int类型的函数,返回类型int

3.1一个代码示例

int Add_Int(int a, int b)
{
	return a + b;

}
int Sub_Int(int a, int b)
{
	return a - b;
}
int main()
{
	
	int(*pfun)(int, int) = nullptr;//函数指针变量的定义
	int x = 10, int y = 20;
	int z = 0;

	//pfun = &Add_Int;
	pfun = Add_Int;//与上面等价
	z = Add_Int(x, y);
	z = pfun(x, y);    //new
	z = (*pfun)(x, y);//old

	pfun = Sub_Int;
	z = (*pfun)(x, y);
	return 0;
}

调用过程:
在这里插入图片描述

  • Add_Int; 函数首元素地址 Add_Int(); 调动此函数

  • 函数指针不能用sizeof计算函数指针所指之物大小,不能+1;

  • 无类型指针也不能计算大小 void

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿可可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值