博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
const与指针及初始化
阅读量:4113 次
发布时间:2019-05-25

本文共 2011 字,大约阅读时间需要 6 分钟。

1.常量本身必须初始化,因此对于本身是常量的指针,必须初始化,比如int* const p=&a;

2.对于指针本身不是常量,但是指向的对象是常量的指针,可以不初始化,比如const int *p、int const *p;

 const是一个的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性

指向常量的指针

const int *pa;

int const *pa;
两者等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性:
*pa =d; // 不可行(d是已经声明过的整型)

但指针本身的值是可变的:

pa=& d; // 可行(d是已经声明过的整型)

而且指向常量的指针有时候也会指向变量,如下:

int t,u;
const int *pa;
pa =&t; //可行,指向变量t
pa =&u; //也可行,指向变量u

我们可以把它理解成:“为了指向常量而发明的指针”,这样比较贴切。

常量指针:

int *const pa =&n; // n是之前已经声明过的整型变量,注意必须是变量,理由见下

“常量指针”即指针本身的值是常量,但“能靠解引用改变它指向的对象的值”,如下:

pa=&d; // 不可行(d是已经声明过的整型)
*pa =d; // 可行(d是已经声明过的整型)

因为常量指针也是一种const常量,所以它同样必须在第一次声明时就初始化,不过它的初始值缩小为只能是变量(的地址),因为只有变量才能确保以后能靠解引用而改变它指向的对象的值。这使得常量指针不象一般的const常量,用变量或常量初始化都可以。

也就是说,常量指针反而总是指向变量的。

举例:

typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;

  答案与分析:
  问题出在p2++上。
  1)、const使用的基本形式: const char m; 
  限定m不可变。
  2)、替换1式中的m, const char *pm; 
  限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。
  3)、替换1式char, const newType m; 
  限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。

char *p = "i'm hungry!";
p[0]= 'I';

  答案与分析
  上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。
总结:

  1)、const在前面

const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const

  2)、const在后面,与上面的声明对等


int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const

  
答案与分析:


  const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:


  沿着*号划一条线,const和谁在一边,那么谁就是const,即const限定的元素就是它。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。


  另外,需要注意:
对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这是限定指针是const。

转载地址:http://sagsi.baihongyu.com/

你可能感兴趣的文章
C语言-static和extern关键字1-对函数的作用
查看>>
C 语言-static和extern关键字2-对变量的作用
查看>>
C# 学习笔记(三) ForEach遍历集合
查看>>
C# 迭代器详解
查看>>
C# 学习笔记(四) 结构体实现接口后是值类型还是引用类型
查看>>
C# 装箱和拆箱
查看>>
C# 学习笔记(五) ++/--运算符重载的意义
查看>>
C# virtual和abstract的区别
查看>>
C++ VS2010中 C++创建DLL图解
查看>>
c# ==与equals有什么区别
查看>>
Sql Server中架构的理解
查看>>
ASCII码表
查看>>
C# 浅析值类型与引用类型的内存分配
查看>>
浮点型变量在计算机内存中的存储格式
查看>>
CPU字节序
查看>>
C# 结构体访问器错误提示
查看>>
C# BackgroundWorker的使用
查看>>
P2P 穿透内网,连接动态ip,内网ip打洞,p2p实现原理
查看>>
C# 设置线程的默认CultureInfo
查看>>
计算机视觉与图像处理、模式识别、机器学习学科之间的关系
查看>>