首页 > 试题广场 >

下列哪两个表达式是等同的。

[问答题]
下列哪两个是等同的
int b;
A const int *a = &b;
B const *int a = &b;
C const int *const a = &b;
D int const *const a = &b;

推荐
各式表示的意思分别为:
A const int* a = &b; //*a是const,但指针a可变
B const* int a = &b; //a是const,但*a可变
C const int* const a = &b; //a和*a都是const,常量和指针的值都不能改变
D int const* const a = &b; //a和*a都是const,常量和指针的值都不能改变 因此C,D两者是相同的。
总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
编辑于 2015-02-07 10:34:33 回复(2)
个人觉得A,B是等价的同时C,D也是等价的。
A,B中,const位于*的左边,表示指针所指向的对象是常量,不能更改,但是指针是可以更改的,比如可以进行++,--等操作。
相反的若const位于*的右边,表示指针本身不能更改,不能进行++、--、移位等操作,但是指针所指向的对象可以更改。
下面举个例子:(程序中注释的语句都是错误的语句)
#include <iostream>
using namespace std;

 
int main()
{
 int a=5;
 int b=10;
 int c=20;
 cout<<&a<<endl;
 cout<<&b<<endl;
 cout<<&c<<endl;
 const int *p1=&b;
 p1++;
// *p1=20;
 int const *p2=&b;
 p2++;
// *p2=20;
 const *int p3=&b;
// : warning C4518: 'int ' : storage-class or type specifier(s) unexpected here; ignored
 p3++;
// *p3=20;

 int * const p4=&b;

 
// p4++;
 *p4=100;

 const int * const a1=&b;
 int const * const a2=&b;
// a1++;
// a2++;
// *a1=200;
// *a2=100;



 cout<<*p1<<" "<<*p2<<" "<<*p3<<" "<<endl;

 return 0;
}

程序中,变量a,b,c存储在栈中,存储的地址按低地址方向扩展。
const int *p1, int const *p2, const * int p3都指向b的地址,由以上可知p1,p2,p3都是指向常对象的指针,即指针所指向的对象
不能更改,但指针可以更改,如进行++操作。进行++以为操作后,指向变量a的地址,所以进行解引用(*)时输出变量a的值。p3//// : warning C4518: 'int ' : storage-class or type specifier(s) unexpected here; ignored
而对于指针p4,int * const p4=&b,*位于const的左边,const修饰的是指针p4,即指针不能改变,但是可以改变指针所指向的对象。

同理const int * const a1=&b;,int const * const a2=&b;是指向常量的常指针,即指针本身和其指向的对象都不能更改。
编辑于 2015-09-04 11:30:17 回复(0)
各式表示的意思分别为: A const int* a = &b; //*a是const,但指针a可变 B const* int a = &b; //a是const,但*a可变 C const int* const a = &b; //a和*a都是const,常量和指针的值都不能改变 D int const* const a = &b; //a和*a都是const,常量和指针的值都不能改变 因此C,D两者是相同的。 总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
发表于 2020-05-07 00:22:59 回复(0)