c 语言 const int,C 语言 const int* 和 int* const 的区别.

本文详细探讨了C++中const关键字修饰指针的各种情况,包括const int *、int const *以及const int *const等,分析了它们分别限制了指针变量本身还是指针指向的内存空间的修改,并通过实例代码解释了在函数参数和返回值中的应用及效果。
摘要由CSDN通过智能技术生成

#include

using namespace std;

/*

学习const 修饰的空间.

const int a;

int const a;

const int* a; // 修饰的 a 指向的内存空间 ,

int* const a; // 修饰的是a 变量.

const int* const a; // 指针变量和指针指向的内存空间都不可以修改..

怎么理解这个呢,修饰的是指针, 那么指针和变量的区别是啥呢,

说白了都是地址, 保护一个指针是一个什么概念呢,

如果是保护的值指针变量本身, 那么和int* const 就没有区别了,

所以, 再向远处想一点,会不会是保护的是指针指向的变量的值不可以修改呢,

回头会发现, const做了一个 堵路的操作,

int* const : 不可以直接操作变量,如修改变量的内容,说白了就是内存中的值.

const* int : 不可以通过指针间接的操作内存中的内容,

反推 : 在整个C 语言的系统中,还有那个操作可以直接修改内存中的值.

const int*

总结 :

决定了一什么样的方式去限制修改内存, const 靠谁近, 就决定了限制方式,

const 离 int* 近, 说明这是一个拒绝间接修改内存空间的.

const 离 变量名近, 说明这是一个拒绝直接修改内存空间的.

*/

void test1()

{

int a = 10;

int c = 100;

const int* b; // 修饰的是未来的空间, 完全可以再起一行进行赋值.

// 这样的操作修改的是b变量, 并不是 const int* 想要的效果,

b = &c;

//*b = 100; // 这个才是正确的验证方法,

int* const d = &a; // 如果修饰的是变量, 那么在初始化的时候, 就必须给值, 不可以再起一行进行赋值.

//d = &c; // 这样的是修饰的是d变量, 如果修改了d变量的值, 程序会提示错误.

/*

小结:

说白了就是保护变量本身的值, 还是保护变量所指空间的值,

保护数据的范围不一样, 一个保护当下资源的值, 另外一个更像是保护更远一点资源的值

怎么用呢,

变量的使用位置:

变量的定义和变量的赋值操作,

按照上述的描述, 会遇到上述的2种情况.

变量在函数实参上的表现

1 如果函数的参数是 const int* 这样的, 意为这什么呢,

在函数内部是可以修改指针对应变量所在内存空间中的值.

2 如果函数的参数是 int* const a,这样的,

在函数内部是, 不可以在给a变量进行赋值的,

变量在函数返回值上的表象,

1 如果函数的返回值是 const int* 这样的,可以么,

2 如果函数的返回值是 int* const 这样的,可以么.

做返回值的这个,完全依赖于接受者是一个什么状态, 接受后要咋个处理, 直接修改内存还是间接修改内存.

*/

}

/*

这样修饰的是变量对应指针的空间不可以修改.

*/

void test1(const int* a)

{

//*a = 100; // 表现和正常的赋值没有区别, 是不允许修改的.

a = (int*)0x01;

return;

}

void test2(int* const a)

{

int c = 100;

//a = &c; // a变量是不可以修改的,

return;

}

/*

const int* 这样的做返回值是没有意义, 接受者必须是一个const int* 类型的

函数返回后,如果对的接受者做 *var= ** 的操作, 如同普通的变量赋值的操作, 还是看

const int* 的约束能力,

*/

const int* test3()

{

static int b = 5;

static int* a =&b;

return a;

}

/*

同 test3是一样的, 函数返回后, 接受者的状态表明了一且,

*/

int* const test4()

{

static int c = 3;

static int* a =&c;

return a;

}

int main()

{

int a = 10;

test1(&a);

const int* p = test3();

//*p = 100; // 这样是不可以的, 修饰的是未来的空间,

cout << *p << endl;

int* const q = test4();

//q = &a;

cout << *q << endl;

return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值