【转】const int *p和int * const p的区别(常量指针与指向常量的指针)
【转】作者:xwdreamer 出处:http://www.cnblogs.com/xwdreamer
对于指针和常量,有以下三种形式都是正确的:
const char * myPtr = &char_A;//指向常量的指针
char * const myPtr = &char_A;//常量的指针
const char * const myPtr = &char_A;//指向常量的常量指针
下面依次对这三种类型进行介绍。
因为*操作符是左操作符,左操作符的优先级是从右到左,对于
1.常量指针(Constant Pointers)
int * const p
先看const再看* ,是p是一个常量类型的指针,不能修改这个指针的指向,但是这个指针所指向的地址上存储的值可以修改。
实例1:
#include<iostream>
#include<stdlib.h>
using namespace std; void main()
{
int i1=;
int i2=;
int * const pi=&i1;//这里的pi指针式常量。
//pi=&i2; //注意这里,pi不能再这样重新赋值了,即不能再指向另一个新地址。所以我已经注释了它。
printf("%d\n", *pi ) ; //输出是30
i1=; //5.想想看:这里能用*pi=80;来代替吗?可以,这里可以通过*pi修改i1的值。
printf("%d\n", *pi ) ; //输出是80
system("pause");
}
实例2:
char char_A = 'A';
char char_B = 'B'; char * const myPtr = &char_A;
myPtr = &char_B; // error - can't change address of myPtr
2.指向常量的指针(Pointers to Constants)
const int *p
先看*再看const,定义一个指针指向一个常量,不能通过指针来修改这个指针指向的值。
实例3:
#include<iostream>
#include<stdlib.h>
using namespace std; void main()
{
int i1=;
int i2=;
const int * pi=&i1;
printf("%d\n", *pi ) ; //输出是30
pi=&i2; //注意这里,pi可以在任意时候重新赋值一个新内存地址
i2=; //想想看:这里能用*pi=80;来代替吗?当然不能
printf("%d\n", *pi ) ; //输出是80 system("pause");
}
实例4:
char char_A = 'A';
const char * myPtr = &char_A;
*myPtr = 'J'; // error - can't change value of *myPtr
所以指针p所指向的整型数是一个常量,其值不能被修改。
3.指向常量的常量指针
对于“指向常量的常量指针”,就必须同时满足上述1和2中的内容,既不可以修改指针的值,也不可以修改指针指向的值。
4.引入字符数组和字符指针
字符数组和字符指针的定义如下:
char a[] = "I Love You!"; //定义了一个字符数组
char *p = "I Love You!"; //定义了一个字符指针
可以将a理解为常量指针,而p为指向常量的指针,代码实例如下:
#include<iostream>
#include<stdlib.h>
using namespace std; void main()
{
char a[] = "I Love You!"; //定义了一个字符数组,数组名a是一个常量指针,指向的位置不变,都是数组第一个元素的位置
char *p = "I Love You!"; //定义了一个字符指针,指针p指向一个字符串常量,这个字符串常量不能修改 //*(p+1)='a';//错误,不可以修改指针指向的值,所以这里注释掉。
a[]='a';//常量指针,不能修改指针的值,但是可以修改指针所指向的值。
//a=p;//错误,a是常量指针,不可修改其值。
cout<<a<<endl;
cout<<p<<endl; cout<<a[]<<endl;
cout<<*(p+)<<endl; system("pause");
}
输出值为:
IaLove You!
I Love You!
a
L
【转】const int *p和int * const p的区别(常量指针与指向常量的指针)的更多相关文章
- const指针和指向常量的指针
先看下面六种写法: . const int p; . const int *p; . int const* p; . int * const p; . const int * const p; . i ...
- 辨析 const指针 和 指向常量的指针
辨析以下几种指针p的定义. ; int *p = &tmp; const int *p = &tmp; int const* p = &tmp; int * const p = ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- C++ 指针(不论什么一个指针本身的类型都是unsigned long int型)
1.指针数组: 即 数组的元素是指针型; 例:int*pa[2]; 明明是一维的指针数组.竟当作二维数组用. [cpp] view plain copy //利用指针数组存放单位矩阵 #include ...
- const int * p 和 int const * p 和 int * const p 的区别
首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * ...
- const int *p与int *const p的区别(转:csdn,suer0101)
本文只是一篇学习笔记,是看了<彻底搞定C指针>中的相关篇幅后的一点总结,仅此而已! 一.先搞清const int *p与int const *p的区别 它们的区别就是:没有区别!! 无论谁 ...
- C++ char*,const char*,string,int 的相互转换
C++ char*,const char*,string,int 的相互转换 1. string转const char* string s ="abc";const char* ...
- const int *p 和int * const p 的区别
看例子: int sloth = 3; const int *p1 = &sloth; int * p2 const = &sloth; 这样申明的话,不允许使用p1来修改sloth的 ...
- (c++) int 转 string,char*,const char*和string的相互转换
一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...
随机推荐
- react-native中的setNativeProps
如果你通过React.createClass方法自定义了一个组件,直接给它设置样式 prop 是不会生效的,你得把样式 props 层层向下传递给子组件 ,直到子组件是一个能够直接定义样式的原生组件. ...
- mysql安装和操作
1.install: 下载地址:https://dev.mysql.com/downloads/ 2.下载zip包解压: 3.自己在该文件夹下创建 my.ini,并编辑内容: [mysql] # 设置 ...
- 高级组件——表格JTable
JTable(Object[][] rowData,Object[] columnNames) 表格数据 列名集合 setSe ...
- python之三元表达式、列表推导、生成器表达式、递归、匿名函数、内置函数
目录 一 三元表达式 二 列表推到 三 生成器表达式 四 递归 五 匿名函数 六 内置函数 一.三元表达式 def max(x,y): return x if x>y else y print( ...
- 关于web-root和web-inf的用处
web-inf下的页面不能直接反问,必须通过servlet页面进行跳转,安全性高. web-root下的页面能直接通过地址栏来访问,安全性低. 哪些页面放在web-root下,哪些放在web-inf下 ...
- java连接数据库报了ssl连接的警告
警告内容:Establishing SSL connection without server's identity verification is not recommended(不建议在没有服务器 ...
- Mysql的SQL语句常用基本命令
SQL语句分类:DDL,DML,DQL,DCL. 1.数据库操作: 创建数据库:create database 数据库名 charater set gbk; 删除数据库:drop database 数 ...
- vue init 解决办法
/由于windows系统的某方面问题,vue脚手架安装可能会出现第一证书丢失 // 报错:vue-cli · Failed to download repo vuejs-templates/webpa ...
- MySQL权限授权认证详解
MySQL权限授权认证详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL权限系统介绍1>.权限系统的作用是授予来自某个主机的某个用户可以查询.插入.修改.删除 ...
- 【JAVA】使用IntelliJ IDEA创建Java控制台工程
1.File->New->Project 2.选择Java,下一步 3.模板有两个:Command Line App和Java Hello World,没有太大区别 4.命名: 5.结果: