const *p 的问题
先看看书上(C++ Perimer)说的话:
我们可以定义一个const 指针指向一个const 或一个非const 对象例如:
int errNumb = 0;
int *const curErr = &errNumb;
curErr 是指向一个非const 对象的const 指针,这意味着不能赋给curErr 其他的地址值但可以修改curErr 指向的值.
试图给const 指针赋值会在编译时刻被标记为错误
curErr = &myErrNumb; // 错误
指向const 对象的const 指针的定义就是将前面两种定义结合起来例如:
const double pi = 3.14159;
const double *const pi_ptr = π
在这种情况下pi_ptr 指向的对象的值以及它的地址本身都不能被改变.
=========================================================================================
下面是我说的:
他的意思就是说const型的指针一旦指向了一个const或非const 的变量,那这个指针就不能指向其他的变量了,我理解的对吗?如果我理解的对,看下面这个程序,如果我理解的不对,请指出!
#include<iostream>
using namespace std;
int main()
{
const int arr=100,*p;
int a=200;
p=&arr;
p=&a;
cout<<*p<<endl;
return 0;
}
程序(VS6测试通过)中的p一开始指向的是arr,但是我改变其指向叫其指向了a,但是没报错啊,请问怎么回事?
问题点数:20、回复次数:8Top
1 楼MarcoCC(成长与不断的跌倒和失败)回复于 2006-01-25 17:07:24 得分 0
你这当然不会错了,
上面说的是:
int *const
你声明的是:
const int *Top
2 楼steedhorse(晨星)回复于 2006-01-25 17:13:33 得分 20
第一,“const int *p”并非“int* const p”,这一点楼主要仔细看书,区别开来。前者是不可修改指向的内容,后者是不可修改指针本身。而“const int* const p”才是既不能修改指针本身,又不能修改指针指向的内容。
第二,不管是什么p,“初始化”是指定义时直接进行的初始化,比如:
const int* p = &i;
int *const p = &i;
之后都是赋值。所以,“一开始指向的是arr,但是我改变其指向叫其指向了a”这句话是不对的,楼主的那个p一开始的时候指向了随机的地方(没有初始化),后来才指向了arr(通过赋值),再后来才指向了a。
第三,尽量不要在同一行里定义或声明多个变量,尤其是一般变量跟指针变量混和更应避免,否则很容易让人误解。
Top
3 楼Cantonese00((⊙_⊙))回复于 2006-01-25 17:28:16 得分 0
#include<iostream>
using namespace std;
int main()
{
int arr=100,*p;
int a=200;
p=&arr;
*p=1;
cout<<*p<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
const int arr=100,*p;
int a=200;
p=&arr;
*p=1; //error C2166: l-value specifies const object
cout<<*p<<endl;
return 0;
}
-------------------------------------
LZ理解一下...
他的意思就是说const型的指针一旦指向了一个const或非const 的变量,那这个指针就不能指向其他的变量了,我理解的对吗?//
这个const要看看它的具体位置在哪:const主要是修饰它紧跟着那个变量:
我们可以定义一个const 指针指向一个const 或一个非const 对象例如:
int errNumb = 0;
int *const curErr = &errNumb;
curErr 是指向一个非const 对象的const 指针,这意味着不能赋给curErr 其他的地址值但可以修改curErr 指向的值.
试图给const 指针赋值会在编译时刻被标记为错误
curErr = &myErrNumb; // 错误
指向const 对象的const 指针的定义就是将前面两种定义结合起来例如:
const double pi = 3.14159;
const double *const pi_ptr = π
在这种情况下pi_ptr 指向的对象的值以及它的地址本身都不能被改变.
----------------------------
要仔细到它的具体位置,才知道它是要谁为常量。Top
4 楼xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)回复于 2006-01-25 18:38:24 得分 0
指针的明白了谢谢各位!,请问:
int const a=10;
const int a=10;
有什么区别?Top
5 楼Rudy023()回复于 2006-01-25 20:48:27 得分 0
没有区别吧Top
6 楼aresfe(Ares)回复于 2006-01-25 22:12:36 得分 0
这个是没有区别的Top
7 楼ugg(逸学堂(exuetang.net))回复于 2006-01-25 22:23:18 得分 0
int const a=10;
const int a=10;
没有什么区别?都是定义常量Top
8 楼Cantonese00((⊙_⊙))回复于 2006-01-25 22:48:13 得分 0
呵呵...
const int a=10;
int const a=10;
是等效的
而:
const int *a;
表示a指向的内容(就是*a表一个值)不能通过a来修改,即如有*a=1的赋值行为将会出错。
int * const a;
表示a是不能改变的指针变量(就是a表一个地址),即有如a=1等的行为,将会编译出错。
Top




