C++中const指针用法汇总
这里以int类型为例,进行说明,在C++中const是类型修饰符:
int a; 定义一个普通的int类型变量a,可对此变量的值进行修改。
const int a = 3;与 int const a = 3; 这两条语句都是有效的code,并且是等价的,说明a是一个常量,不能对此常量的值进行修改。
const int* p =&a; 与 int const* p = &a; 这两条语句都是有效的code,但是它们不是等价的。其中const int* p = &a; 是平时经常使用的格式,声明一个指针,此指针指向的数据不能通过此指针被改变;int* const p = ∫ 声明一个指针,此指针不能被改变以指向别的东西。
const int *a; 这里const修饰的是int,而int定义的是一个整值,因此*a所指向的对象值不能通过*a来修改,但是可以重新给a来赋值,使其指向不同的对象;
int *const a; 这里const修饰的是a,a代表的是一个指针地址,因此不能赋给a其他的地址值,但可以修改a指向的值;
int const *a;和const int *a;的意义是相同的,它们两个的作用等价;
rules:
(1). A non-const pointer can be redirected to point to other addresses.
(2). A const pointer always points to the same address, and this address can not be changed.
(3). A pointer to a non-const value can change the value it is pointing to. These can not point to a const value.
(4). A pointer to a const value treats the value as const (even if it is not), and thus can not change the value it is pointing to.
以下是一些test code,详细信息可见相关的reference:
#include <iostream>
#include "const_pointer.hpp"
int test_const_pointer_1()
{
{ // reference: https://stackoverflow.com/questions/3247285/const-int-int-const
int a = 5;
int *p1 = &a; //non-const pointer, non-const data
const int *p2 = &a; //non-const pointer, const data, value pointed to by p2 can’t change
int * const p3 = &a; //const pointer, non-const data, p3 cannot point to a different location
const int * const p4 = &a; //const pointer, const data, both the pointer and the value pointed to cannot change
int const * const p5 = &a; // 与 const int * const p5等价
}
{ // reference: https://stackoverflow.com/questions/162480/const-int-vs-int-const-as-function-parameter-in-c-and-c
// read the declaration backwards (right-to-left):
const int a1 = 1; // read as "a1 is an integer which is constant"
int const a2 = 1; // read as "a2 is a constant integer"
// a1 = 2; // Can't do because a1 is constant
// a2 = 2; // Can't do because a2 is constant
char a = 'a';
const char *s = &a; // read as "s is a pointer to a char that is constant"
char const *y = &a; // 与 const char *y 等价
char c;
char *const t = &c; // read as "t is a constant pointer to a char"
// *s = 'A'; // Can't do because the char is constant
s++; // Can do because the pointer isn't constant
*t = 'A'; // Can do because the char isn't constant
// t++; // Can't do because the pointer is constant
// *y = 'A';
y++;
}
{ // reference: http://www.geeksforgeeks.org/const-qualifier-in-c/
int i = 10;
int j = 20;
int *ptr = &i; /* pointer to integer */
printf("*ptr: %d\n", *ptr);
/* pointer is pointing to another variable */
ptr = &j;
printf("*ptr: %d\n", *ptr);
/* we can change value stored by pointer */
*ptr = 100;
printf("*ptr: %d\n", *ptr);
}
{ // const int *ptr <==> int const *ptr
int i = 10;
int j = 20;
const int *ptr = &i; /* ptr is pointer to constant */
printf("ptr: %d\n", *ptr);
// *ptr = 100; /* error: object pointed cannot be modified using the pointer ptr */
ptr = &j; /* valid */
printf("ptr: %d\n", *ptr);
}
{ // int * const ptr
int i = 10;
int j = 20;
int *const ptr = &i; /* constant pointer to integer */
printf("ptr: %d\n", *ptr);
*ptr = 100; /* valid */
printf("ptr: %d\n", *ptr);
// ptr = &j; /* error */
}
{ // const int *const ptr;
int i = 10;
int j = 20;
const int *const ptr = &i; /* constant pointer to constant integer */
printf("ptr: %d\n", *ptr);
// ptr = &j; /* error */
// *ptr = 100; /* error */
}
{ // reference: http://www.learncpp.com/cpp-tutorial/610-pointers-and-const/
int value = 5;
int *ptr = &value;
*ptr = 6; // change value to 6
const int value2 = 5; // value is const
// int *ptr2 = &value2; // compile error: cannot convert const int* to int*
const int *ptr3 = &value2; // this is okay, ptr3 is pointing to a "const int"
// *ptr3 = 6; // not allowed, we can't change a const value
const int *ptr4 = &value; // ptr4 points to a "const int"
fprintf(stderr, "*ptr4: %d\n", *ptr4);
value = 7; // the value is non-const when accessed through a non-const identifier
fprintf(stderr, "*ptr4: %d\n", *ptr4);
}
return 0;
}
//////////////////////////////////////////////////////////
// reference: https://en.wikipedia.org/wiki/Const_(computer_programming)
class C {
int i;
public:
int Get() const { // Note the "const" tag
return i;
}
void Set(int j) { // Note the lack of "const"
i = j;
}
};
static void Foo_1(C& nonConstC, const C& constC)
{
int y = nonConstC.Get(); // Ok
int x = constC.Get(); // Ok: Get() is const
nonConstC.Set(10); // Ok: nonConstC is modifiable
// constC.Set(10); // Error! Set() is a non-const method and constC is a const-qualified object
}
class MyArray {
int data[100];
public:
int & Get(int i) { return data[i]; }
int const & Get(int i) const { return data[i]; }
};
static void Foo_2(MyArray & array, MyArray const & constArray) {
// Get a reference to an array element
// and modify its referenced value.
array.Get(5) = 42; // OK! (Calls: int & MyArray::Get(int))
// constArray.Get(5) = 42; // Error! (Calls: int const & MyArray::Get(int) const)
}
typedef struct S_ {
int val;
int *ptr;
} S;
void Foo_3(const S & s)
{
int i = 42;
// s.val = i; // Error: s is const, so val is a const int
// s.ptr = &i; // Error: s is const, so ptr is a const pointer to int
// *s.ptr = i; // OK: the data pointed to by ptr is always mutable,
// even though this is sometimes not desirable
}
int test_const_pointer_2()
{
C a, b;
Foo_1(a, b);
MyArray x, y;
Foo_2(x, y);
S s;
Foo_3(s);
return 0;
}
GitHub:https://github.com/fengbingchun/Messy_Test
C++中const指针用法汇总的更多相关文章
- Leetcode刷题之矩阵中的指针用法
矩阵中的指针用法 1 快慢指针 Leetcode27移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度.不要使用额外的数组 ...
- C/C++中const的用法 分类: C/C++ 2015-07-05 00:43 85人阅读 评论(0) 收藏
const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...
- C++中const关键字用法
为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替 ...
- C++中cin的用法汇总
cin可以用于接收输入,最常见的是从控制台接收.在刚学习C++的时候经常会用cin来接收数据,这里想要系统的总结一下cin的用法,保证不灌水. C++中的cin是一个 istream对象,从标准输入中 ...
- Vue3中插槽(slot)用法汇总
Vue中的插槽相信使用过Vue的小伙伴或多或少的都用过,但是你是否了解它全部用法呢?本篇文章就为大家带来Vue3中插槽的全部用法来帮助大家查漏补缺. 什么是插槽 简单来说就是子组件中的提供给父组件使用 ...
- 如何牢记C/C++中const的用法?
(下面以 typename 表示C/C++内某一类型 我常常会搞混 const 放在 typename* 的前面和后面的区别,今天特地查看了它们两个各自的含义,总结了一下: const typenam ...
- js中typeof的用法汇总[转载]
http://www.jb51.net/article/43187.htm JavaScript中的typeof其实非常复杂,它可以用来做很多事情,但同时也有很多怪异的表现.本文列举出了它的多个用法, ...
- C++中const的用法
1.const修饰普通变量和指针 (1).const修饰普通变量 其写法有2种:a.const type value; b.type const value; 这两种写法本质上是一样的.其含义是: ...
- 基于c语言中调试工具的用法汇总(不包含gdb)【转】
转自:http://www.jb51.net/article/36829.htm 是不是只有编译的时候才知道程序写了错误?有没有在未编译的时候就让机器帮你检查错误的工具呢? 答案是:有!! splin ...
随机推荐
- Python之字符编码(Day10)
1. python解释器执行py文件的原理 ,例如python test.py 第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器 第二阶段:python解释器相当于文本编辑器, ...
- 操作系统(Day2.5)
一.为何要有操作系统 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以 ...
- IE调试页面总结
随着IE版本的升级,IE变的越来越强大,随之带来的问题也是越来越明显,如:如何调试在低版本的浏览器中 的情况 IE9的方法: 出于未知需求,用户在安装了较高版本IE浏览器(IE9)之后,又需要使用低版 ...
- 解决XAMPP不能启动Apche服务问题
打开command prompt输入命令 netstat -ano 查看哪个 PID的进程占用了80端口.结果是inetinfo.exe 网上查了下,正是WIN XP IIS的进程,但是又不想删,就只 ...
- 算法:LRU(最近最少使用)
算法:LRU(最近最少使用) 本文参考自小灰文章:https://mp.weixin.qq.com/s/B5xiVeW22ZumbI9KfrYJSg LRU算法 什么是LRU算法 LRU算法又称最近最 ...
- BZOJ 5312: 冒险
首先我们考虑,对于And 和 Or 操作,对于操作位上只有And 0 和 Or 1 是有效果的. 我们注意到如果区间内需要改动的操作位上的数字都相同,那么是可以区间取与以及区间取或的. 那其实可以维护 ...
- shell 学习一
一.shell脚本 打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行 #!/bin/bash echo &q ...
- jmeter 分布式集群
Jmeter压测过程中,由于测试机配置有限,CPU.内存都可能是存在瓶颈.如果使用很大的并发进行测试时,就可能会感到程序比较卡,这时候就无法继续增加压力了. 解决方法: 搭建Jmeter分布式集群,远 ...
- HDU4635
/* 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边, 那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是, 同时X部中每个点到Y部的每个点都有一条边,假设X部有 ...
- Sybase:SybaseIQ的几个系统过程
Sybase:SybaseIQ的几个系统过程 sp_iqlocks 显示与数据库中 IQ 存储区和目录存储区中的锁有关的信息. 删除锁:drop connection XXX sp_iqwho 显示所 ...