c语言中const 类型变量地址赋值给指针。
2017-01-20 16:41
543 查看
作者:余天升
链接:https://www.zhihu.com/question/21792567/answer/19354371
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
const在C语言中是表示道义上保证变量的值不会被修改,并不能实际阻止修改,通过指针可以修改常变量的值,但是会出现一些不可知的结果。几种情况不同,我们一个一个来看。
1、直接赋值
这种情况不用多说,编译错。
2、使用指针赋值,@孙健波提到的方法,在gcc中的warning,g++中出现error,是因为代码写得不对,由非const的变成const不用显式的转换,const变为非const需要显式转换,这种情况应当使用显式的类型转换。
运行结果(注:使用msvc编译的结果一致):
这里使用g++编译时,a的值之所以没有改变,是因为编译时a是常量,然后被编译器编译为立即数了。因此对使用b指针修改不会更改a的值。
值得注意的是,如果a被定义为全局常变量,使用指针修改会引发segment fault。
在函数的原型中,我们也常用const修饰指针,表示函数的实现者在道义上不会去修改这个指针所指向的空间。例如我们熟知的strcpy函数,原型如下:
传入的参数src类型是const char*,表示函数内部实现不会修改src所指向的空间。之所以说是道义上,是因为在内部通过上述指针强制类型转换的方式可以修改该空间的值。另外,如果我们声明了我们不会修改传入指针的所指向的空间,那么我们也不应当去修改这块空间,因为这个传入的指针可能会是一个不可写的内存,然后出现段错误。
链接:https://www.zhihu.com/question/21792567/answer/19354371
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
const在C语言中是表示道义上保证变量的值不会被修改,并不能实际阻止修改,通过指针可以修改常变量的值,但是会出现一些不可知的结果。几种情况不同,我们一个一个来看。
1、直接赋值
const int a = 3; a = 5; // const.c:6:2: error: assignment of read-only variable ‘a’
这种情况不用多说,编译错。
2、使用指针赋值,@孙健波提到的方法,在gcc中的warning,g++中出现error,是因为代码写得不对,由非const的变成const不用显式的转换,const变为非const需要显式转换,这种情况应当使用显式的类型转换。
const int a = 3; int* b = (int*) &a; printf("a = %d, *b = %d\n", a, *b); *b = 5; printf("a = %d, *b = %d\n", a, *b);
运行结果(注:使用msvc编译的结果一致):
$ gcc const.c $ ./a.out a = 3, *b = 3 a = 5, *b = 5 $ g++ const.cpp $ ./a.out a = 3, *b = 3 a = 3, *b = 5
这里使用g++编译时,a的值之所以没有改变,是因为编译时a是常量,然后被编译器编译为立即数了。因此对使用b指针修改不会更改a的值。
值得注意的是,如果a被定义为全局常变量,使用指针修改会引发segment fault。
在函数的原型中,我们也常用const修饰指针,表示函数的实现者在道义上不会去修改这个指针所指向的空间。例如我们熟知的strcpy函数,原型如下:
char* strcpy(char* dst, const char* src);
传入的参数src类型是const char*,表示函数内部实现不会修改src所指向的空间。之所以说是道义上,是因为在内部通过上述指针强制类型转换的方式可以修改该空间的值。另外,如果我们声明了我们不会修改传入指针的所指向的空间,那么我们也不应当去修改这块空间,因为这个传入的指针可能会是一个不可写的内存,然后出现段错误。
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- Lua和C语言的交互详解
- C#中const 和 readonly 修饰符的用法详解
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C和指针小结(推荐)
- C语言中fchdir()函数和rewinddir()函数的使用详解
- 浅谈C语言转义字符和格式控制符
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- 利用C语言的Cairo图形库绘制太极图实例教程
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法