24、指针的本质

变量代表一段存储空间的别名,但并不是只能通过变量才能访问一段内存了,指针也可以

1、*号的意义

  • 在指针声明时,* 号表示所声明的变量为指针
  • 在指针使用时,* 号表示取指针所指向的内存空间中的值
    在这里插入图片描述
    指针 p 里面存放的是变量 i 的地址,*p 表示取变量 i 的值。
p = &i;
*p = i;

为什么指针的大小占用为4个字节?
因为如果系统是32位,地址寻址范围为4个字节,所有的32位地址值都可以用4个字节表示,所以32位系统指针的大小都为4个字节
`
2、传值调用与传址调用

  • 指针是变量,因此可以声明指针参数
  • 当一个函数体内部需要改变实参的值,则需要使用指针参数
  • 函数调用时实参值将复制到形参
  • 指针适用于复杂数据类型作为参数的函数中

我记得我当初刚学这里的时候被SWAP函数折磨了很久,现在想来,以前是真的菜,我觉得主要还是要搞懂作用域的问题,我们可以把函数当成一个副本,无论你传值调用怎么去修改值,对我值本身根本没有影响。就像你在桌面上复制一个文档生成一个副本。你在副本里面怎么修改文档,对我原文档是一点影响都没有。
但是传址调用不一样,你用指针交换的时候,真实值就已经改变了。

#include <stdio.h>

//void SWAP(int a, int b)           这段代码是错误的。
//{
//	int c = a;
//	a = b;
//	b = c;
//}

void SWAP(int* a, int* b)
{
	int c = *a;
	*a = *b;
	*b = c;
}
int main()
{
	int a = 1;
	int b = 2;

	printf("a = %d\n", a);
	printf("b = %d\n", b);

	SWAP(&a, &b);
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	return 0;
}

在这里插入图片描述

3、常量指针

const int* p;					//p可变,p指向的内容不可变	
int const* p;					//p可变,p指向的内容不可变
int* const p;					//p不可变,p指向的内容可变
const int* const p				//p和p指向的内容都不可变

口诀:左数右指
当 const 出现在 * 号左边时指针指向的数据为常量,
当 const 出现在 * 号右边时指针本身为常量。

#include <stdio.h>

int main()
{
	int i = 0;

	const int* p1 = &i;
	int const* p2 = &i;
	int* const p3 = &i;
	const int* const p4 = &i;

	*p1 = 1;	//error
	p1 = NULL;

	*p2 = 2;	//error
	p2 = NULL;

	*p3 = 3;
	p3 = NULL;	//error

	*p4 = 4;	//error
	p4 = NULL;	//error

	return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值