03.Const使用

全局const和局部Const区别

//1. const全局和局部变量区别?
//const全局变量在常量区,不能修改(直接或者间接)
const int g_c = 100;
void test03()
{
	//直接修改不行
	//g_c = 200;

	//间接修改也不行
	int *p = (int *)&g_c;
	*p = 200;

	//全局const放在常量区,一旦初始化,不能修改
}

//2. const局部变量  在栈上
void test04()
{
	//栈上
	const int a = 100;
	//a = 200;

	int *p = (int *)&a;
	*p = 200;

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

}

const修饰指针

1.通过指针修改const修饰的常量
const int a = 10;
a = 100;//语法错误,a的值不能修改
int *p = &a;
*p = 100;
a =100; //这种可以修改指针和变量的值
可以通过1级指针修改一个常量的值

2.const修饰指针类型 int * 不能改变指针变量指向的内存地址的值 但是可以改变指针指向的地址 
const int *p = &a
p=&b
*p = 100   //语法错误
可以改变指针指向的地址

3.const修饰指针变量    能改变指针指向地址的值,但不能改变指针指向的地址
int * const p = &a;
*p = 100;
 p=&b   //语法错误
可以修改指针指向地址的值

4.const修饰指针类型修饰指针变量  不能改变指针指向的的值 也不能改变指针指向的地址 
const int * const *p = &a;
*p =100;  //语法错误
p = &b;   //语法错误

int main()
{
	int a = 10;
	//如果const修饰int *,则不能改变指针变量指向的内存地址的值,不能修改a的值,但是可以修改指针指向的地址
	const int* p;
	p = &a;
	*p = 100;//有语法错误,不能修改a的值
	int b = 20;
	p = &b;//修改p的指向,指向b,但是还是不能修改b的值
	cout << "*p修改以前的值=====" << *p << endl;
	system("pause");
	return EXIT_SUCCESS;
}

const增强

C语言中const是伪常量,可以通过指针修改,下面的输出是200,200

void test07()
{

	//m_A = 100;
	const int m_B = 20; //伪常量
	//m_B = 100;

	int * p = (int *)&m_B;
	*p = 200;
	printf("*p = %d , m_B = %d \n", *p, m_B);

	//int arr[m_B]; 不可以初始化数组

}


C++中const会放入到符号表中 ,下面的输出是200,20。因为并没有分配内存,所以值并没有修改

void test07()
{

	const int m_B = 20; //真正常量
	//m_B = 100;

	int * p = (int *)&m_B;
	*p = 200;
	cout << "*p = " << *p << endl;
	cout << "m_B = " << m_B << endl;

}


C语言中const默认是外部链接,C++中const默认是内部链接

const int a = 10; //C语言中默认const是外部链接

int main(){

	extern const int a; //告诉编译器在a在外部
	printf("a = %d \n ", a);

	system("pause");
	return EXIT_SUCCESS;
}

test.cpp中的a变量必须使用extern提高作用域才能被使用,extern const int a = 10; //C++中的const默认内部链接 ,extern提高作用域,只有上面的申明,外面才能用a

int main(){

	extern const int a;
	cout << a << endl;

	system("pause");
	return EXIT_SUCCESS;
}

const分配内存情况

对变量取地址,会分配临时内存
extern关键字下的const会分配内存
用普通变量初始化const变量
自定义数据类型会分配内存

#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;

//1、const分配内存 取地址会分配临时内存
//2、extern 编译器也会给const变量分配内存
void test01()
{
	const int m_A = 10;
	int * p = (int*)&m_A; //会分配临时内存
	*p = 200;
	cout << "*p = " << *p << endl;// *p = 200
	cout << "m_A = " << m_A << endl; //m_A = 10

}

//3、 用普通变量初始化 const 的变量
void test02()
{
	int a = 10;
	const int b = a; //会分配内存

	int * p = (int *)&b;
	*p = 1000;

	cout << "b = " << b << endl;// b = 1000

}

//4、 自定义数据类型  加const也会分配内存
struct Person
{
	string m_Name; //姓名
	int m_Age;
};

void test03()
{
	const Person p1;
	//p1.m_Name = "aaa";

	Person * p = (Person*)&p1;
	p->m_Name = "LLLLLL";
	(*p).m_Age = 18;

	cout << "姓名: " << p1.m_Name << " 年龄: " << p1.m_Age << endl;
	//姓名: LLLLL      年龄:18

}


int main(){

	//test01();
	//test02();
	test03();

	system("pause");
	return EXIT_SUCCESS;
}

尽量以const替换#define

1.const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查.
2.const有作用域,而#define不重视作用域,默认定义处到文件结尾.如果定义在指定作用域下有效的常量,那么#define就不能用。
Const可以规避地址传递的副作用---使用对象指针的时候会把数据修改。c语言的值传递太占空间

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct Person
{
	char name[64];
	int age;
	int ID;
	double score;
};

//规避地址传递的副作用(在使用对象指针的情况下,有可能意外修改数据)
void PrintPerson(const struct Person *person)
{

	//person->ID = 128;

	struct Person *p = (struct Person *)person;



	//p->ID = 128;

	printf("Name:%s Age:%d ID:%d Score:%f\n",person->name,person->age,person->ID,person->score);
	
}

void test()
{
	struct Person person = { "Trump", 30, 250, 59.9 };
	PrintPerson(&person);
}


int main(){

	test();

	system("pause");
	return EXIT_SUCCESS;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值