常量指针&指针常量


更新日志:
1.优化补充2024/02/14

前言

const的作用就是将一个变量修改为只读状态,就类似我们电脑中打开了一个只读文件,你想往里面存储数据是不可能实现的。使用const修饰的变量内容可以防止在程序运行中数据被篡改,我们经常用到的标准库函数也是如此使用的,例如 memcpy的原型为:
void *memcpy (void *__restrict __dest, const void *__restrict __src,size_t __n);
中间scr部分就是使用const进行修饰的是为了防止在函数内操作过程中原数据被篡改,从而保证原数据的安全。类似函数还有很多如memcmp等。

一、常量指针

  • 数据格式
    数据类型 const 指针变量;
    const 数据类型 指针变量;

特点:
指针指向变量的值不可以改变,但指针指向的对象可以改变。
可以借用此特点保护一些只读但不想被改变的数据。

例一:正确使用案例

#include "stdio.h"
void main(void)
{
	int const *p=NULL;//常量指针
	int a=10;
	p=&a;//进行地址赋值
	printf("%#x--%#x\r\n",p,&a);//打印地址值
	printf("%d--%d\r\n",a,*p);//打印数据值
}

运行结果:
0xf8ab433c–0xf8ab433c(说明:受不同编译器影响地址值可能不同)
10–10

分析
该例程是对常量指针进行地址赋值,让其地址改变。

例二:错误使用案例

#include "stdio.h"
void main(void)
{
	int const *p=NULL;//常量指针
	int a=10;
	p=&a;//地址赋值正确
	*p=20;//值赋值错误
	printf("%#x--%#x\r\n",p,&a);//打印地址值
	printf("%d--%d\r\n",a,*p);//打印数据值
}

运行结果:
error: assignment of read-only location ‘*p’

分析
a.该程序是一个错误示范案例,首先常量指针将* p已经修饰为只读变量了,因此想再向* p进行写内容就不可能了,这也就是常量指针的一个特点,值不能改变,但是地址的可以改变。
b.在这里就不再示范const int *p了请读者自行实验!

二、指针常量

  • 数据格式
    数据类型* const 指针变量;
    特点:
    指针指向的地址不可被改变,但指针指向对象的值可进行改变。
    一般初始化时进行赋值。即将指针变量定义为可读类型的变量。

例一:正确使用

#include <stdio.h>
int main(void)
{
	int a=10;
	int *const p=&a;//初始化时赋值a的地址
	*p=20;
	printf("%#x--%#x\r\n",p,&a);
	printf("%d--%d\r\n",a,*p);
}

运行结果:
0xa68bf58c–0xa68bf58c(说明:受不同编译器影响地址值可能不同)
20–20

分析
该例程是对指针常量进行数据赋值,让其值改变。

例二:错误使用1

#include <stdio.h>
int main(void)
{
	int *const p=NULL;//定义时并未赋值
	int a=10;
	p=&a;//向只读指针变量赋值
   *p=20;
	printf("%#x--%#x\r\n",p,&a);
	printf("%d--%d\r\n",a,*p);
}

运行结果:
error: assignment of read-only variable ‘p’

分析
p是指针变量,该例程中初始化时并未对p进行赋值a的地址,因const为只读修饰,造成后期无法在改变p的值,从而p=&a错误;

例二:错误使用2

#include <stdio.h>
int main(void)
{
    int a=10;
	int *const p=&a;//初始化赋值正确
	int b=5;
	p=&b;//二次赋值错误
   *p=20;
	printf("%#x--%#x\r\n",p,&a);
	printf("%d--%d\r\n",a,*p);
}

运行结果:
error: assignment of read-only variable ‘p’

分析
p是指针变量,该例程中初始化赋值为变量a的地址正确,但由于const将p修饰为只读指针,因此不可二次进行写(赋值)操作;

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值