首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • IBM 的一道考题,老郁闷了,麻烦前辈来拆解一下,谢谢!!
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mage1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-21 17:29:16 楼主
    const char *const * keywords

    const char const * keywords

    const char *const  keywords

    const char const keywords

    请问以上四种定义,
    所得出的变量有什么区别,各代表什么?(请从维数、用途等方面简要说明)

    有没有前辈来帮帮忙啊!!

    谢谢了!!
    40  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sukyin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:36:041楼 得分:0
    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既不能修改指向的对象,也不能修改只想对象的值。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lzr4304061988012
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:40:552楼 得分:0
    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:42:183楼 得分:0
    mark~ 一楼好牛,呵呵.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:42:334楼 得分:0
    学习~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • weiyijiji
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:45:575楼 得分:0
    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常量
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yvhkpgf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:46:206楼 得分:0
    学习中,不错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dahua010
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:46:277楼 得分:0
    const int* a 和 int const *a  的意思是一样的~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianyuxiaoqiang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:46:338楼 得分:0
    好的。学习。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mage1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:48:489楼 得分:0
    首先感谢一楼的兄弟

    你说的这些我是知道的

    例如我问题中的第三条
    const char *const  keywords

    就是声明一个指针,其本身和其指向的对象都不能修改。

    但是1,2,4呢?
    能不能具体分析一下?小弟觉得第一条const char *const * keywords
    像是一个二维指针啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • weiyijiji
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:54:2710楼 得分:0
    引用 9 楼 mage1982 的回复:
    首先感谢一楼的兄弟

    你说的这些我是知道的

    例如我问题中的第三条
    const char *const  keywords

    就是声明一个指针,其本身和其指向的对象都不能修改。

    但是1,2,4呢?
    能不能具体分析一下?小弟觉得第一条const char *const * keywords
    像是一个二维指针啊

    是1个二维指针,它指向的1个指针,这个指针指向的地址和值都是不变的,而这个二维指针可以指向其他地址
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lyae
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 18:08:3911楼 得分:0
    又见变态考题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unbutun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 18:10:2212楼 得分:0
    学习,mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wind_breez
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 20:49:2713楼 得分:0
    记得貌似有本书说过,这种情况倒着看。例如const char *const * keywords,看*认为是一个指针,指向一个const的指针(*),而这个指针指向一个const char(const char=char const)。
    合起来就是说一个指向常指针的指针,该常指针指向一个字符常量。

    呵呵,其他的同理了。如果错了,请各位批评指正啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Silitex
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:36:0314楼 得分:0
    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; }


    这里keywords是一个二级指针,他指向一个const char*的指针,而const char*这个指针就一步了然了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:47:1515楼 得分:0
    呵呵,今儿看见一个帖子,说是按*分隔,const在哪边就修饰那边!~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Silitex
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:51:3116楼 得分:0
    对这个问题比较感兴趣,那么就再写多一点吧:
    第一题:
    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; }

    这个的输出结果为:
    Hello world!
    Hello world!
    可不可以这样写呢:const char *const int * keywords;
    答案是不行的,char类型的二级指针再指向一个int类型的地址,无这种用法。即无论再多级指针:
    const int *const *const * keywords;每一级指向的都是int类型。举例:
    C/C++ code
    #include <iostream> using namespace std; int main(void) { const char *const *const * keywords; const char *const * keywords2; const char *p = "Hello world!\n"; keywords2 = &p; keywords = &keywords2; cout << p << **keywords; return 0; }


    第二题:
    const char const * keywords
    等于:
    const char * keywords
    OK,它是一个指向const char的指针

    第三题:
    const char *const  keywords
    OK,它是一个指向const char的常指针,即指针本身的存储属性也是const

    第四题:
    const char const keywords
    等于:
    const char keywords
    OK, 它是一个字符常量
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • e_sharp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:51:4417楼 得分: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 一个一个的分析就明白了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiao_ke
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:52:2318楼 得分:0
    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

    这样看起来应该好些
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • greenbit
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:59:0519楼 得分:0
    引用 5 楼 weiyijiji 的回复:
    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常量


    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:06:1620楼 得分:0
    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;
    常量字符
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • apollofsc2008
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 11:02:4621楼 得分:0
    强人果然很多,const一直是个难点啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jest850615
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 11:14:3122楼 得分:0
    const char 等同于 char const;
    char * keywords 类似于 keywords[];
    const的作用不用说了吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • changjiangcug
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 11:25:3423楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • aaajj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 14:34:3924楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • White_Fish
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 15:31:2625楼 得分:0
    我觉得17楼的更好理解一些。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wind_breez
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 17:37:1226楼 得分:0
    const char *const * keywords --->
    倒着看
    key * cosnt * char const
    把*翻译成pointer to:
    key is a pointer to a const pointer to const char!
    也就是key是一个指向(指向字符常量的常指针)的指针变量(有点拗口),key是一个二维指针!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ztz0223
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 19:27:1027楼 得分:0
    const 由×决定,在×前是对象不可以变,在后则指针不可以变,so easy
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • vxworksdoc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 19:53:4728楼 得分:0
    const   char   *const   *   keywords  

    const   char   const   *   keywords       //这是个错误!

    const   char   *const     keywords         //这也是个错误!  

    const   char   const   keywords  

    一帮傻逼还在上面装逼解释呢。
    修改 删除 举报