const类型变量的详细解读
2017-12-30 19:08
369 查看
const类型变量
--------------------------------------
int i;
const int *p;
--------------------------------------
int i;
int *const p = &i;
--------------------------------------
int i;
const int *const p = &i;
三者有何区别呢?
--------------------------------------
指向常量的指针 和 指针常量
const int *p; //定义一个指向常量的指针。
int *const p; //定义一个指针常量,一旦指向某一变量的地址后,不可再指向其他变量的地址。(注意:指针常量也叫常量指针)
二者区别:
const int *p; //p是一个变量,但指向一个常量。(即p可以指向任何地址,但是只能通过*p来读这块地址的内容,不能通过*p来写这块地址的内容)
int *const p; //p是一个常量,但指向一个变量或者常量。(即如果一旦p指向了任何一个有效的地址后,就不可再指向其他变量的地址,但可以通过*p来读写这块地址的内容)
--------------------------------------
1. const int *p;
const用来修饰int *,*p的内容不可变。
2. int *const p = &i;
const用来修饰p,p是一个常量指针,p只能指向固定的一个变量的地址,但可以用*p读写这个变量的值。
指针p的地址不可变。即表示p指向了i的地址,而且p只能指向i的地址,不可再指向其他变量的地址。
int i = 0;
int j = 0;
int *const p = &i;
p = &j; //错误
i = 1; //正确
*p = 1; //正确
3.const int *const p = &i;
同时限制了指针指向的内容和指向的地址。
--------------------------------------
int i;
const int *p;
--------------------------------------
int i;
int *const p = &i;
--------------------------------------
int i;
const int *const p = &i;
三者有何区别呢?
--------------------------------------
指向常量的指针 和 指针常量
const int *p; //定义一个指向常量的指针。
int *const p; //定义一个指针常量,一旦指向某一变量的地址后,不可再指向其他变量的地址。(注意:指针常量也叫常量指针)
二者区别:
const int *p; //p是一个变量,但指向一个常量。(即p可以指向任何地址,但是只能通过*p来读这块地址的内容,不能通过*p来写这块地址的内容)
int *const p; //p是一个常量,但指向一个变量或者常量。(即如果一旦p指向了任何一个有效的地址后,就不可再指向其他变量的地址,但可以通过*p来读写这块地址的内容)
--------------------------------------
1. const int *p;
const用来修饰int *,*p的内容不可变。
linux下示例代码如下: #include <stdio.h> int main01() { int a = 0; int *p = &a; //此时的p指向了一个int类型的地址,可以通过*p的方式来修改这个内存a的值。 *p = 10; printf("a = %d\n", *p); //或者printf("a = %d\n", a); //此时的*p可读可写。 return 0; } int main() { int a = 0; const int *p = &a; //此时的p指向了一个int类型的地址,但不可以通过*p的方式来修改这个内存a的值。 //*p = 10; a = 10; //但是呢,不可以通过*p来改a的值,可以通过a去修改a的值。 printf("a = %d\n", *p); //或者printf("a = %d\n", a); //此时的*p可读不可写。 //c语言的一个小漏洞 const int b = 100; //b = 0; //定义了一个常量,那么这个常量权限是只读了。 //通过指针的方法:即可以通过指向一个变量地址的指针去指向它,然后通过*p1去间接的修改b的值。 //注意编译的时候会出现警告!我们忽略这个警告强行改!这时把b的值改了!!! //warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] //警告:赋值时从指针目标类型丢弃“const”限定符[-Wdiscarded-qualifiers] //这就是在c语言中用常量的时候不用const了! //因为c语言中的const是有问题的,因为可以通过指针变量间接的修改const定义的常量的值,所以在c语言中用#define定义常量的时候更多。 //为什么#define不能改呢?实质上#define就是一个文本替换,直接把它替换成一个整数了,整数是一个常量,又不是一个变量。 //但是在C++中就没有这个漏洞了。为什么呢?因为c++里面的const是个真的const,而c语言中的const只是在语法的角度不让你去赋值,实际上是假的。 //这是c语言本身存在的弱项。 int *p1; p1 = &b; //为了避免这个warning,使用强转即可:p1 = (int *)&b; *p1 = 0; printf("b = %d\n", b); //或者printf("b = %d\n", *p); int *const p2 = &a; //表示p2指向了a的地址,而且p2只能指向a的地址,不可再指向其他变量的地址。 //p2 = &b;//直接编译错误//p2是一个常量指针,p2只能指向固定的一个变量的地址,但可以用*p2读写这个变量的值。 return 0; }
2. int *const p = &i;
const用来修饰p,p是一个常量指针,p只能指向固定的一个变量的地址,但可以用*p读写这个变量的值。
指针p的地址不可变。即表示p指向了i的地址,而且p只能指向i的地址,不可再指向其他变量的地址。
int i = 0;
int j = 0;
int *const p = &i;
p = &j; //错误
i = 1; //正确
*p = 1; //正确
3.const int *const p = &i;
同时限制了指针指向的内容和指向的地址。
相关文章推荐
- 【c++笔记七】教你使用"const类型的对象、成员函数"和"static类型的成员函数、变量"
- 不同类型的变量在内存中存储的详细情况
- c++基础:const,变量的作用域和生存期,存储类型
- 局部变量。函数参数。const类型。
- const类型的成员函数内部如何改变成员变量
- 详细解析Python当中的数据类型和变量
- C++ 中的 const 类型变量
- 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
- C++ static、const和static const类型成员变量声明以及初始化
- 参数中有const时进行数据类型的转换问题-固定变量转常量
- PHP数组内存利用率低和弱类型详细解读
- 关于const类型变量的一些知识
- c/c++笔试题——const类型的成员函数内部如何改变成员变量
- 简单解读java的各种变量类型转换知识
- 怎么通过反射的方式获取指定变量名称的值呢?比如说一个const类型的常量:const string aa=123
- 第2章 变量和基本类型 附3---底层const和顶层const
- C++ 中的 const 类型变量
- C++ 变量和基本类型(二) const 限定符
- C语言技巧【枚举作为函数变量类型】【数据输入与输出】【do while循环体内scanf函数被跳过,循环结束】【用const修饰函数的参数】
- 【iOS开发基础教程】C语言 const类型变量