首页 > 试题广场 >

请找出下面程序中有哪些错误

[单选题]
请找出下面程序中有哪些错误:
int main(){
   int i = 10;
   int j = 1;
   const int *p1;//(1)
   int const *p2 = &i; //(2)
   p2 = &j;//(3)
   int *const p3 = &i;//(4)
   *p3 = 20;//(5)
   *p2 = 30;//(6)
   p3 = &j;//(7)
return 0;
}
  • 1,2,3,4,5,6,7
  • 1,3,5,6
  • 6,7
  • 3,5
const在前,内容不能变;
const在后,指针不能变;
const* ,指针指向为常量;
*const ,指针本身为常量。
发表于 2015-09-06 11:15:20 回复(14)
(1)const int*p1:表示不能通过指针p1修改它指向的内存单元的值,但是p1本身可修改。
(2)int const*p2=&i:与p1相同,即不能修改p2指向的内存单元的值,但是可以修改p2使其指向其它的内存单元。这里p2指向了整型变量i
(3)p2=&j:修改p2,使其指向整型变量 j ,由(2)可知(3)没错。
(4)int *constp3=&i:p3本身是指向整型变量的常指针,即p3初始化后不能再指向其它的内存单元,但是可以修改p3指向的内存单元的值。这里p3指向了整型变量i。
(5)*p3=20:通过p3将变量i的值修改为2,由(4)可知(5)没错。
(6)*p2=30:通过p2修改它所指向的内存单元的值,由(2)可知(6)错误。
(7)p3=&j:修改p3,使其指向j,由(4)可知(7)错误。
发表于 2015-09-11 10:45:52 回复(3)
不用死记!  理解记忆
遇到const修饰的时候,从右向左读 最容易区分
如: const int *p1;//则const 修饰的是int *p1 说明这个变量是不能变的,就是p1所指向的变量是常量变量

int const *p2 = &i; //const修饰的是  *p2(表示所指向的变量)  说明p2所指的变量不能改变,也就是 指向常量变量。

int *const p3 = &i;  //const修饰的是  p3  说明指针变量的值不能改变,也就是不能让p3指针再指向其他值

发表于 2015-11-30 19:25:09 回复(10)
constint*p1表示p1的内容为常量不可变
intconst*p2表示p2的内容为常量不可变
int*constp3表示p3指针本身为常量不可变
其中(6)改变了p2的内容(7)改变了p3的指针,所以错误
发表于 2015-09-06 09:49:37 回复(2)
看这个吧,关键是“ 从右向左读的记忆方式”
发表于 2015-09-06 15:23:53 回复(0)
关键知识!!:
1 如果关键字const出现在星号左边,表示被指物是常量;
2 如果出现在星号右边,表示指针自身是常量;
3 如果出现在星号两边,表示被指物和指针两者都是常量。
      const int *p1;//(1)  关键字const出现在星号左边 表示被指物是常量,而指针不是常量,可以不必须初始化
   intconst*p2=&i; //(2)ok ,p2被取i的地址
   p2=&j;//(3)ok,p2取j的地址
   int*constp3=&i;//(4) 出现在星号右边,表示指针自身是常量,必须初始化,这里初始化为i的地址,不允许修改
   *p3=20;//(5)ok,修改p3所指向的内容,
   *p2=30;//(6)被指物是常量 error!
   p3=&j;//(7) 指针自身是常量 error!

发表于 2016-08-18 16:11:04 回复(1)
我觉得遇到这种题,从“结合律”的角度来看就很好理解,先看两个简单的,比如const int a  和 int const a。const int a里的const和int结合,是一个意思是一个整型的常量,a作为一个整型常量,是不能改变的;再看 int const a,const和a结合,意思也是 a是一个常量,不能被改变。综上所述,const int a  和 int const a作用是一样的。(也可以总结出一个复杂的结论:const放在类型符号 前 / 后 作用是一样的。
然后我们来看const int* p, int const* p以及int *const p。
继续使用“结合律”:
1.const int* p     ,const和int结合在一起,意思是p指向一个整型常量,换句话说就是不能通过指针p改变p所指向的那块内存里的东西,因为它是一个常量,举个栗子就是,如果这样的p指向A,我们不能通过p改变A,但是我们可以让p不指向A,而指向别的B C D  E F G等等。
2.int const* p     ,const和*p结合在一起,意思也是p指向一个常量,换句话说就是不能通过指针p改变p所指向的那块内存里的东西,因为它是一个常量,这样写和1里const int *p那样写最终效果是一样的,不能理解的话你可以向上看看我加黑的字体——const放在类型符号 前 / 后 作用是一样的。
3.int *const p    ,const和p结合在一起,意思是p这个指针本身是一个常量,不能改变指针本身,但可以改变指针指向的那块内存里的数据,通俗地说就是,如果p是指向变量A的,你不能将p改为指向B,但是p指向的内容A却是可以修改的。
我们再来看一个栗子,const int * const p,const和p结合,p这个指针自身是一个常量,p如果指向A的话,那么就不能将p改为指向B了;再看另一个const,它和int结合在一起,也就是p指向的东西是一个常量,不能通过指针p改变p所指向的那块内存里的数据。
So,你明白了吗?
————————————————————————————————————————————————————————————
下面要补充一点东西,如果你理解我上面所写的内容的话:
int *const p必须在定义的时候就给p赋值,意思是要写成int *const p=&a才可以编译通过,仅仅是写成int *const p而未给p初始化那是编译不通过的。为什么呢?其实很好理解,const修饰的常量都必须在声明时立马定义,而后就再也不能修改了,指针p作为一个常量,也是要遵守这个规则的。

觉得我写得好的给我点个赞吧,如果有错误欢迎拍砖,多多指教!!
发表于 2018-01-18 22:19:21 回复(0)
const在前,内容不能变;
const在后,指针不能变;
const* ,指针指向为常量;
*const ,指针本身为常量。
发表于 2021-08-29 19:37:45 回复(0)
//总结看来,const在*前时,指向的内容不可变;const在*后时,指向地址不可变,且初始化时需要初始值设定项。

int a = 1, b = 2, c = 3;
const int *p1 = &a;
p1 = &b;
*p1 = 4;//表达式必须是可修改的左值
int const *p2 = &b;
p2 = &c;
*p2 = 5;//表达式必须是可修改的左值
int *const p3 = &c;//p3需要初始值设定项
p3 = &a;//表达式必须是可修改的左值
*p3 = 6;

编辑于 2017-07-09 16:37:35 回复(0)
const int a; int const a; 这两个写法是等同的,表示a是一个int常量。
const int *a; 表示a是一个指针,可以任意指向int常量或者int变量,它总是把它所指向的目标当作一个int常量。也可以写成int const* a;含义相同。
int * const a; 表示a是一个指针常量,初始化的时候必须固定指向一个int变量,之后就不能再指向别的地方了。
int const * const a; const既修饰 *a 又修饰 a  因此两者都是不可改变的。也可以写成const int* const a;含义相同。
总结:遇到int const 都换成 const int ,在有指针的情况下:
1)const 紧贴指针变量前面,表示修饰该变量为常量,即指针本身为常量。
2)const 紧贴值类型前面,表示修饰修饰的类型值为常量,即指针所指类型对象为常量。
凡是修饰当前变量为常量的const 都是顶层const, 修饰指针所指对象为常量的const是底层const。
发表于 2016-03-29 10:14:04 回复(0)
Const在*的左边,表示指针指向的数据是常量,数据不能通过解引用修改,指针本身是变量可以修改。 const在*的右边表示常量指针,指针本身不能通过解引用改变,但是它所指向的数据是可以改变的
发表于 2015-09-06 11:03:17 回复(0)
const修饰谁,谁就不能变。如const *p,则值不能变;*const p,则地址p不能变;const * const p,则地址和值都不能变。
发表于 2021-11-18 20:25:28 回复(1)
const 修饰一个变量为只读
从左往右看,跳过类型,看修饰哪个字符
如果是*,说明指针指向的内存不能改变
如果是指针变量,说明指针的指向不能改变,即指针的值不能修改。
于是可以得出6.7为错误选项。

发表于 2019-05-15 10:28:26 回复(0)
const int *p与
int const *p是等价的
发表于 2017-07-31 21:53:39 回复(0)
赋值运算符忽略顶层const,底层const资格不能忽略
发表于 2016-09-17 09:50:48 回复(0)
主要看const和*的位置,*const则指针地址不可变,内容可变;const*则指针地址可变,指向的内容不可变
发表于 2016-03-23 00:08:15 回复(0)
可能大家有一个疑问,const 声明的对象用初始化赋值吗? 
书中是这样描述的,“符号常量在使用之前 一定要首先声明”   符号常量 eg:const pi=3.1415; pi这种个人指定的符号,叫做符号常量
发表于 2015-10-10 22:19:37 回复(2)
const在*的左边 表示地址存储值为常量 例∶const int*p *p不能改变 const在*的右边 表示指针为常量 例∶ int * const p p不能改变
发表于 2023-02-27 12:46:46 回复(0)
    int a=1, b=2;
    
    //指向const的指针,也可写成int const* p1 
    const int *p1 = &a; //指向整形常量的指针,它指向的值不能修改
    p1 = &b;            //可以再指向别的变量 
    (*p1)++;            //编译报错,不能通过*p1去修改a的值 
    a++;                //可以修改a的值 

    //const指针 
    int *const p2 = &a;   //指向整形的常量指针,它不能在指向别的变量,但指向的变量的值可以修改
    p2 = &b;              //编译报错,不能再指向别的变量
    (*p2)++;              //可以通过*p2修改指向的变量的值 
    a++;                  //可以修改a的值
    
    const int *const p3 = &a;  //指向整形常量的常量指针,既不能再指向别的常量,指向的值也不能修改。
    p3 = &b;       //编译报错,不可以再指向别的变量 
    (*p3)++;       //编译报错,不可以通过*p3修改指向的变量的值 
    a++;           //可以修改a的值 
发表于 2019-05-12 17:40:14 回复(0)
const的作用:
1. 定义常量(必须初始化);
2. 保护值不被修改(不比初始化);
~~~~~
具体到这道题:
1236是const在*前使用,作用是规定指针指向的值不能通过指针来修改(所以不必初始化!)
比如*p1 = 1;*p2=2都是错误的。
6不符合规则,所以错;
注意,简单的说内容不可变不严谨,比如p2指向的内容i可以直接修改:i = 4;
~
457是const在*后使用,作用是定义常指针(所以一定初始化!)
常指针本身不能变,指向内容可以变,所以5对7错;
~~~~~
const int a = 10;//是定义整型常量,第一种用法,必须初始化。
发表于 2018-04-18 20:45:39 回复(1)