const指针用法

原创 2012年03月24日 16:06:50

前两天面试,问道一个const和指针结合的操作,当时完全蒙了,这两天看书,又遇到这个问题,因此下决心解决掉。


1、const int * p和int const *p意义相同,不能更改p所指向的内容,但是可以更改p指向的对象,例如

#include <stdio.h>
int
main(void)
{
  int a=10;
  const int *p;
  p=&a;
  *p=5;
  return 0;
}

编译时出错,错误内容如下:

goku@ubuntu:~/tcpl/others$ gcc t_pconst.c
t_pconst.c: 在函数‘main’中:
t_pconst.c:8:2: 错误: 向只读位置‘*p’赋值

由此可见,不能更改p指向的内容,下面例子,展示了更改指针指向的对象

#include <stdio.h>
int
main(void)
{
  int a=10;
  int b=5;
  //const int *p;
  int const *p;
  p=&a;
  printf("a = %d,*p = %d\n",a,(*p));
  p=&b;
  printf("b = %d,*p = %d\n",b,(*p));
  return 0;
}

编译运行,得到下面的结果:

goku@ubuntu:~/tcpl/others$ ./a.out
a = 10,*p = 10
b = 5,*p = 5


2、int *const p可以更改p指向的内容,但是不能更改p,使得p指向其他对象

还是用例子来解释

#include <stdio.h>
int
main(void)
{
  int a=10;
  int b=5;
  int *const p=&a;
  printf("a = %d,*p = %d\n",a,(*p));
  p=&b;
  printf("b = %d,*p = %d\n",b,(*p));
  return 0;
}
编译时,出现下列错误:

goku@ubuntu:~/tcpl/others$ gcc t_pconst.c
t_pconst.c: 在函数‘main’中:
t_pconst.c:10:2: 错误: 向只读变量‘p’赋值

由此可见,不能更改p,使得p指向其他对象,但是可以更改p指向的内容,例如:

#include <stdio.h>
int
main(void)
{
  int a=10;
  int b=5;
  int *const p=&a;
  printf("a = %d,b = %d,*p = %d\n",a,b,(*p));
  printf("change the context of p!\n");
  (*p)=b;
  printf("a = %d,b = %d,*p = %d\n",a,b,(*p));
  //p=&b;
  //printf("b = %d,*p = %d\n",b,(*p));
  return 0;
}

运行结果如下:

goku@ubuntu:~/tcpl/others$ ./a.out
a = 10,b = 5,*p = 10
change the context of p!
a = 5,b = 5,*p = 5
针对这种情况,指针在声明的时候,就要初始化,使其指向一个内存单元。

3、const int * const p既不能更改p指向的变量的内容,也不能更改p指向的对象。例子就省略了,自己测试下吧。

#include <stdio.h>
int
main(void)
{
  int a=10;
  int b=5;
  int const *const p=&a;
  printf("a = %d,b = %d,*p = %d\n",a,b,(*p));
  printf("change the context of p!\n");
  *p=b;
  printf("a = %d,b = %d,*p = %d\n",a,b,(*p));
  p=&b;
  printf("b = %d,*p = %d\n",b,(*p));
  return 0;
}

编译结果,如下:

goku@ubuntu:~/tcpl/others$ gcc t_pconst.c
t_pconst.c: 在函数‘main’中:
t_pconst.c:10:2: 错误: 向只读位置‘*p’赋值
t_pconst.c:12:2: 错误: 向只读变量‘p’赋值


最后,还要注意以下一个细节:

指向非const变量的指针或者非const变量的地址可以传给指向const变量的指针,编译器可以做隐式类型转换,例如:

int a = 10;
const char *p = &a;

但是,指向const变量的指针或者const变量的地址不可以传给指向非const变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告

const int a = 19;
int *p = &a;

即使不用const限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const,因为:

  1. const给读代码的人传达非常有用的信息。比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *const char *指针,而不必担心指针所指的内存单元被改写。

  2. 尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。

  3. const对编译器优化是一个有用的提示,编译器也许会把const变量优化成常量。


C语言中的const用法以及常量指针与指针常量(有口诀!)

编了这样的口诀,记住,应该不难: const(*号)左边放,我是指针变量指向常量; const(*号)右边放,我是指针常量指向变量; const(*号)两边放,我是指针常量指向常量; 指针变量...
  • xiaocheng198810
  • xiaocheng198810
  • 2014年11月27日 10:19
  • 3100

This 指针和const 修饰This指针

This指针及其作用
  • QQ960054653
  • QQ960054653
  • 2017年02月24日 23:28
  • 126

友元函数与操作符重载入门+const修饰this指针

先对比一下成员函数与全局函数的区别 先对比下全局函数与普通的成员函数 #include class Test { public: //理解this指针的关键,站在测试程序的角度去思考 //什么...
  • u011391093
  • u011391093
  • 2015年01月01日 16:36
  • 593

C语言中关于const与指针结合的理解

C语言中const的可变与不可变的关系总结为:只有被const直接修饰的变量最终指向的内容不可变(忽略变量类型修饰符,即int, long等)。...
  • u011408809
  • u011408809
  • 2016年07月05日 19:17
  • 1300

c++const指针与函数调用

在我的博客http://blog.csdn.net/caoyan_12727/article/details/52064958中,已经讨论了动态绑定和静态绑定,以及在缺省参数情况下虚函数的绑定情况。一...
  • caoyan_12727
  • caoyan_12727
  • 2016年09月10日 10:50
  • 394

C++的引用与const指针的关系以及各种传递方式

首先我们知道 const int p 与 int const *p 是一样的,即 *p 是常量;而 int const p 跟上面是不一样的,即 p 是常量;我们知道引用只是一个别名,与变量共享存储...
  • Sandeldeng
  • Sandeldeng
  • 2016年10月24日 23:02
  • 452

const变量通过指针修改 详解

本来以为const变量是无法修改的,今天发现“错了”(其实没错,通过const变量本事是无法修改其值的,但是在“某些情况下”可以通过指向它的指针来间接修改) 一、const变量可以通过指针修改的情况 ...
  • hyqsong
  • hyqsong
  • 2016年03月12日 20:42
  • 1442

const与指针结合的三种情况

//1.const int *p //不能修改指针指向的内存空间中的值 //2.int * const p //不能修改指针本身指向,但是可以修改指向内存空间的值 //...
  • vs9841
  • vs9841
  • 2015年10月29日 09:21
  • 582

C++中引用、指针与const之间的爱恨情愁

学过C语言基础的肯定都知道变量和数据类型是再简单不过的知识,然而这个基础中确有几个泥潭,稍有不慎就粉身碎骨——编程受阻,面试被刷。其中一个就是引用、指针和const,以及相互之间剪不断理还乱的关系。今...
  • xueyushenzhou
  • xueyushenzhou
  • 2016年08月30日 21:59
  • 1654

关于const常量、const指针以及const引用

这篇博客从头到尾的讲一下关于const的一些问题。 1.const常量 与变量不同,有const修饰的量是常量,常量的值不可改变,在定义的时候必须初始化,使用未初始化的常量是错误的。以前还经常弄不清楚...
  • Mysunshinetbg
  • Mysunshinetbg
  • 2015年09月10日 17:12
  • 4688
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:const指针用法
举报原因:
原因补充:

(最多只允许输入30个字)