C语言基础---12.const使用(数组指针、指针常量,常量指针、常量指针常量、常量数组)

1、普通数组指针


#include <stdio.h>

int main() {

	char data = 'a';
	char* p = &data;
	printf("%c   \n", *p);

	printf("===============\n");

	char dd = 'd';
	p = &dd;			// 指针可以指向其他内存地址
	printf("%c   \n", *p);

	printf("===============\n");

	*p = 'e';			// 可以通过指针内存的值
	printf("%c   \n", dd);

}



a
===============
d
===============
e



2、char* const p (指针常量)

重点:const修饰什么,什么就不能被改变!!!

  • char * const p 中,const修饰的是p,所以p(指针指向的内存地址)不能改变,也就是指针常量,不能指向其他的地址了!
  • 但是,指针指向的值(内存保存的值)可以改变
#include <stdio.h>

int main() {

	char data = 'a';
	char buf = 'b';
	printf("%p	  \n", &data);

	printf("==============\n");
	char* const p = &data;
	printf("%p    \n", p);
	
	//p = &buf;    						//error:assignment of read-only variable‘p’
	*p = 'A';
	printf("==============\n");
	printf("%p    \n", p);
	printf("%c    \n", *p);
}

00CFFE43			// data 变量的地址
==============
00CFFE43			// 指针p指向data之后,指针p的地址
==============
00CFFE43			// 指针解引用*p,修改某地址中的值之后,指针p的内存地址还是没变
A

  • 指针常量-----char* const p ,const修饰指针p,说明p不能指向其他地址了!
  • 通过*p = 'A’可以改变了这个内存地址的值,p的指向还是之前的地址


3、const char* p (常量指针)

重点:const修饰什么,什么就不能被改变!!!

  • const 修饰的是 *p, 而*p代表解引用,代表是的某个内存地址保存的值,所以*p = xx直接赋值肯定不行的!
  • const没有修饰p,所以指针的地址( p )可以改变,即指针的指向可以改变,最终*p也就改变了!
#include <stdio.h>

int main() {

	char data = 'a';
	char buf = 'b';
	printf("%p	  \n", &data);
	printf("==============\n");
	
	const char*  p = &data;
	printf("%c   \n", *p);
	printf("%p    \n", p);
	printf("==============\n");
	
	// *p = 'A';					// const修饰*p,所以不能通过解引用修改指针指向的值
	p = &buf;						// 但是,可以改变指针的指向
	printf("%p    \n", p);
	printf("%c   \n", *p);
}

010FFAB7			// 打印变量data的地址值
==============

a					// 指针*p对应的字符的值
010FFAB7			// 指针p对应的地址的值,指针p指向了data的地址
==============


010FFAAB			// 改变指针的指向之后,指针对应的地址值
b					// 指针p的指向变了,所以最终的解引用的值也变了!

  • 常量指针,const char* p,const修饰的是*p,说明这个指针指向的值*p不能改变。
  • 虽然*p不能修改,但p可以修改,即p可以指向另一个内存空间,最终*p的值变化了。
  • 注意:虽然*p的值在如上过程变化了,但是是通过改变p的指向,间接改变了*p的值,而不是直接使用*p=‘m’这种方式改了*p的值!!!


4、const char * const p (常量指针常量)

使用const修饰*p & p, 双重修饰

  • 不能通过p改变指针指向
  • 也不能通过*p改变指针指向地址的值

#include <stdio.h>

void main() {

	char data = 'a';
	char buf = 'b';
	printf("%p	  \n", &data);
	printf("==============\n");

	const char * const p = &data;
	*p = 'A';					// 不能通过解引用方式,修改内存地址的值
	p = &buf;					// 也不能,修改指针的指向地址

}




5、const修饰数组


#include <stdio.h>

int main() {

	// const char array[5] = { 'a', 'b', 'c' };		// const char, char const 是等价
	char const array[5] = { 'a', 'b', 'c' };

	char* p = &array;
	*(p + 1) = 'e';
	//array[2] = 'd';		//左值指定const对象,表达式必须是可修改的左值
	printf("%s   \n", array);

}
aec

  • const 修饰的数组,不能通过数组直接修改数组中的参数
  • 但是,如果指针指向了数组,可以通过指针指向的地址,通过改变内存地址的值,改变数组中元素的值!

《C语言基础—8.const的理解、左值&右值的理解》

代码中*(p + 1) ='e’解释



  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hello-alien

您的鼓励,是我最大的支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值