const指针用法

前两天面试,问道一个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变量优化成常量。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值