const int *p,int *const p区别(转)

1)先从const int i说起。
使用const修饰的i我们称之为符号常量。即,i不能在其他地方被重新赋值了。注意:const int i与int const i是等价的,相同的,即const与int的位置无所谓。
2)const int *p
看例子:
int i1=30;
int i2=40;
const int *p=&i1;
p=&i2;  //此处,p可以在任何时候重新赋值一个新的内存地址。
i2=80;  //这里能用*p=80来代替吗?答案是不能
printf("%d",*p);  //输出80
分析:p的值是可以被修改的,即它可以重新指向另一个地址。但是不能通过*p来修改i2的值。
首先,const修饰的是整个*p(注意,是*p而不是p),所以*p是常量,是不能被赋值的。虽然p所指的i2是变量而不是常量;
其次,p前并没有用const修饰,所以p是指针变量。能被赋值重新指向另一个内存地址。
3)int * const p
int i1=30;
int i2=40;
int * const p=&i1;
//p=&i2;  错误的。p不能再指向另一个新地址了。
i1=80;  //这里能用*p=80来代替,即可以通过*p修改i1的值。
printf("%d",*p);
分析:
此时p的值不能被赋值修改了,只能永远指向初始化时候的内存地址。相反,可用*p修改i1的值了。
所以:综上所述,
指针p因为有了const的修饰,所以为指针常量,即,指针p不能修改了。
整个*p前面没有const修饰,则*p为变量而不是常量,所以,可改变*p的值。
如果const修饰在*p前则不能改的是*p,而不是指p;
如果const是直接写在p前,则p不能改。
4)补充
const int i1=40;
int *p;
p=&i1;  //提示错误,无法从const int转为int。
----------------------------------------
const int i1=40;
const int *p;
p=&i1;  //两个类型相同,可以这样赋值。

原文地址:http://blog.sina.com.cn/s/blog_6af956630100vpv2.html

时间: 2024-11-29 01:53:00

const int *p,int *const p区别(转)的相关文章

int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别

 加有const关键字的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = # 1.       可以读自己 2.       可以通过*p改自己 3.       可以通过p = &data来看别人 权限最大 cons int *p = # 1.const放在左边意味着指向的是常量,这个常量不可以修改, 2.p = &data; (地址可以修改) 3.*p = 30;(这个时候是错误的) 这两者等价(应用:查看别人的账户) i

const int* 和 int const*的区别?

Thinking in C++ 看到了第八章,讲的是指针. 这里提出这两个的区别是: 1.const int* 指向const的指针 对于这个的解释是:     const int* u;       //u是一个指针, 它指向一个const int.这里不需要初始化,因为u可以是指向任意标识符(也就是说它不是一个const),但是它的值是不能被改变的. 2.int const*这个是指向int 的const指针 对于这个的解释是:      int * const w = &d; 现在读成w是

const int * pi/int * const pi的区别

前面有一篇文章:数组名就是常量指针 参考文章:http://blog.pfan.cn/whyhappy/5164.html const int * pi .int const * pi与int *  const  pi及其操作 1 从const int i 说起    你知道我们申明一个变量时像这样int i :这个i是可能在它处重新变赋值的.如下:int i=0;//…i=20;//这里重新赋值了    不过有一天我的程序可能需要这样一个变量(暂且称它变量),在申明时就赋一个初始值.之后我的程

int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针

恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); int main(); int main(int argc, char **argv);   //等价于int main(int argc, char *argv[]),是否等价呢?是不是前一个可以表示任意长度的任意个数组,后一个只是定长的任意个数的数组?见下面 int main(int argc, c

关于int &const t和 int const& t

#include<iostream.h> #include<stdio.h> int main() { int i = 0; int const& j = i; int & const t = i; const int& m = i; i = 3; printf("j = %d m = %d  t = %d i = %d &j = %d &m = %d &t = %d",j,m,t,i,&j,&m,

C/C++中的const int*和int * const

代码: 1 #include <iostream> 2 3 using namespace std; 4 5 int main(){ 6 const int *p; 7 int a = 2; 8 p = &a; 9 a = 5; 10 11 cout<<p<<" "<<*p<<endl; 12 13 int b = 10; 14 p = &b; 15 16 cout<<p<<"

const int*和int* const

int sloth = 3; const int* ps = &sloth; int* const finger = &sloth; ps不能修改sloth的值,但可以指向另一个位置. finger可以修改sloth的值,但不能指向其它位置. finger和*ps都是const,而*finger和ps不是. ——————————<C++ primer plus>

c语言检测文件是否存在int __cdecl access(const char *, int);

最近写代码,遇到很多地方需要判断文件是否存在的.网上的方法也是千奇百怪,“百家争鸣”. fopen方式打开的比较多见,也有其他各种方式判断文件是否存在的,由于其他方法与本文无关,所以不打算提及. 笔者近来使用winapi比较多,于是顺便搜索了msdn,找到了一个函数:PathFileExists BOOL PathFileExists( _In_ LPCTSTR pszPath ); 以下是笔者最初的方法,windows api原则上提供的函数应该是最合理高效的,起码这个方法在windows平台

对于这个函数const int func(const int&amp; a) const声明中,三个const分别是什么意思?

第一个const 函数的返回值类型是const. 这个const修饰没什么意义,你可以想象一下: 既然是函数的 返回值,而且是值传递的形式,是否const有什么意义.如果指针(引用)传递,怎表示返回值的内容不可修改:一般用在赋值操作中,例: const A& operator =() { ... }第二个const修改函数的输入参数,这样可以提高效率.如:用实参b调用const int func(const int& b) const时,将跳过调用的过程(不复制函数),而直接运行它的内容.