IBM 的一道考题,老郁闷了,麻烦前辈来拆解一下,谢谢!!
const char *const * keywords
const char const * keywords
const char *const keywords
const char const keywords
请问以上四种定义,
所得出的变量有什么区别,各代表什么?(请从维数、用途等方面简要说明)
有没有前辈来帮帮忙啊!!
谢谢了!!
[解决办法]
1.指向const对象的指针
const int *p;
这个p是一个指向int类型const对象的指针,const限定了指针p所指向的类型,而并非p本身。也就是说p本身并不是const。在定义时不需要对它进行初始化,还可以给p重新赋值,使其指向另一个const对象。但不能通过p修改所指向对象的值。
示例1:int a=0; p=&a; 可以。
示例2:*p=20; 不可以。
结论:这种指向const对象的指针只是限制不能修改p指向对象的数值,而不是限制p指向什么对象。
把一个const对象的地址赋给一个不是指向const对象的指针也是不行的。
示例3:const int b=10;
int *p2=&b; //error
const int *p3=&b; //ok
结论:因为变量b有const修饰,不能被修改。但指针p2是一个普通的指针,可以修改指向对象的值,两种声明矛盾,所以不合法。而指向const对象的指针不允许修改指针指向对象的数值,所以这种方式合法。
2.const指针
int c=20;
int *const p4=&c;
指针p4称为const指针。它和指向const对象的指针恰好相反,它不能够修改所指向对象,但却能够修改指向对象的数值。另外,这种指针在声明时必须初始化。
3.指向const对象的const指针
const int d=30;
const int *const dp=&d;
指针dp既不能修改指向的对象,也不能修改只想对象的值。
[解决办法]
up
[解决办法]
mark~ 一楼好牛,呵呵.
[解决办法]
学习~~
[解决办法]
const char *const * keywords
keywords是1个普通的指针,指向1个指向常量的常量指针
const char const * keywords
=char const * keywords
keywords是1个普通的指针,指向1个char常量
const char *const keywords
keywords是1个常量指针,指向1个char常量
const char const keywords
=const char keywords
keywords是1个char常量
[解决办法]
学习中,不错
[解决办法]
const int* a 和 int const *a 的意思是一样的~~
[解决办法]
好的。学习。
[解决办法]
[解决办法]
又见变态考题
[解决办法]
学习,mark
[解决办法]
记得貌似有本书说过,这种情况倒着看。例如const char *const * keywords,看*认为是一个指针,指向一个const的指针(*),而这个指针指向一个const char(const char=char const)。
合起来就是说一个指向常指针的指针,该常指针指向一个字符常量。
呵呵,其他的同理了。如果错了,请各位批评指正啊!
[解决办法]
- C/C++ code
#include <iostream>using namespace std;int main(void){ const char *const * keywords; const char *p = "Hello world!\n"; keywords = &p; cout << p << *keywords; return 0;}
[解决办法]
呵呵,今儿看见一个帖子,说是按*分隔,const在哪边就修饰那边!~
[解决办法]
对这个问题比较感兴趣,那么就再写多一点吧:
第一题:
- C/C++ code
#include <iostream>using namespace std;int main(void){ const char *const * keywords; const char *p = "Hello world!\n"; keywords = &p; cout << p << *keywords; return 0;}
[解决办法]
1. ( (const char) *const) * keywords //指针,前面是指针指向的类型
2. (const char const) * keywords //指针,前面是指针指向的类型
3. (const char) *const keywords //常量指针,前面是指针指向的类型
4. (const char const) keywords //常量,char前后的const都一样
看的时候,4 3 2 1 一个一个的分析就明白了
[解决办法]
const char *const * keywords == const (char*) const *keywords
const char const * keywords == const (char) const *keywords
const char *const keywords == const (char*) const keywords
const char const keywords == const (char) const keywords
这样看起来应该好些
[解决办法]
[解决办法]
const char *const * keywords1;
二级指针, const在第二个*之前表示二级指针指向的内容不可修改,但是二级指针本身可以修改,
14楼给了例子,所以:
const char *p1 = "Hello world!\n";
keywords = &p2;
const char *p2 = "Hello world!\n";
keywords = &p2;
是可以运行的!
const char const * keywords2;
相当于const char* keywords2;
const char *const keywords3;
这个大家都知道
const char const keywords4;
常量字符
[解决办法]
强人果然很多,const一直是个难点啊
[解决办法]
10楼给的答案有问题。
引用10楼的答复:
是1个二维指针,它指向的1个指针,这个指针指向的地址和值都是不变的,而这个二维指针可以指向其他地址。
你这句话中的“它指向的1个指针,这个指针指向的地址和值都是不变的”好像是有问题的。
我们分两步来分析一下语句:const char *const *keywords
step1:去掉const,结果是char ** keywords //说明keywords是个二维指针
step2:去掉char, 结果是const *const *keywords //这里我们假如keywords = &p;实际上不能通过keywords来改变p的指向,
//但p本身却可以改变自己的指向;
//另外不能通过keywords来改变p的内容,但p可以通过本身来改变自己的内容。
下面是我给的一个例子。
int main(void)
{
int c = 34;
int a = 10;
const int *const *pp;
int *p2 = &c;
int *p1 = &a;
pp = &p1;
*pp = p2; //wrong!
**pp = 11; //wrong!
p1 = &c; //that's ok!
*p1 = 100; //that's ok!
return 0;
}