| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1054 人关注过本帖
标题:关于一个char指针的问题
只看楼主 加入收藏
ClarenceC
Rank: 2
等 级:论坛游民
帖 子:54
专家分:18
注 册:2014-1-10
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:12 
关于一个char指针的问题
char *cha[]={"hello","world","xiao","gang"};
      请问这样表述 cout<<*(cha+1)<<endl; 和这样表述cout<<*cha+1; 有什么区别?
      (说说我的理解:以上两种表述cha是指向“hello”的指针,所以*cha+1应该是指向第二个“world”,但实际上*(cha+1)才是指向的“world”。
          为什么输出*cha+1是“ello”?)
     还有就是在这段代码中size_t csize=sizeof(cha)/sizeof(char *); 为什么可以用sizeof(char *)来表示数组中每一元素的字节长度,而不是sizeof(*cha)?
    谢谢各位。

[ 本帖最后由 ClarenceC 于 2014-2-11 18:32 编辑 ]
搜索更多相关主题的帖子: hello world 2014 元素 
2014-02-11 18:30
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
char *cha[] : shi zhi zhen shu zu, li mian de mei yi ge yuan su dou shi yi ge zhi xiang zi fu chuan de zhi zhen.

想抽苏烟了。
2014-02-12 01:52
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 楼主 ClarenceC
char *cha[4]={"hello","world","xiao","gang"};  ni zhe ge bian yi ke yi tong guo????

想抽苏烟了。
2014-02-12 02:05
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 楼主 ClarenceC
char *cha[] 这个是指针数组,每一个元素都是一个指向一个字符串的指针。*(cha+1)这里cha+1是第二个字符串的指针,*(cha+1)就是第二个字符串的内容。*解引用。
C++中string类重载了 = 可以将 char * 转换为string对象, 指针加1就是向后移一个数据,原数据是 'h','e','l','l','o' ,'\0' 后移一个就是指向 'e','l'...所以输出ello。
举个例子你这个程序里cout<<*cha+2 就会输出llo。
我就是这么理解的,如果不对,坐等大神详细讲解。

想抽苏烟了。
2014-02-12 04:12
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
char *cha[4]={"hello","world","xiao","gang"};请问下后面进来的大神,这个舒适化合法么?我的编译器就不能通过要改成const char *cha[4]={......}

想抽苏烟了。
2014-02-12 10:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用fl8962在2014-2-12 10:06:15的发言:

char *cha[4]={"hello","world","xiao","gang"};请问下后面进来的大神,这个舒适化合法么?我的编译器就不能通过要改成const char *cha[4]={......}

可以通過的。其實編譯後自動也是const,要明確寫是太嚴格的要求,沒壞。

授人以渔,不授人以鱼。
2014-02-12 11:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
char* arr[] = { "hello", "world", "xiao", "gang" };
這個arr定義,等價於char arr[4][6](祇是按“等價於”來理解,其實兩者是不同的,後面這個嚴格限制了内存佈局,而前者不是),arr是一個4元素的一維數組,每個元素儲存一個指向某字符串的指針,也就是說,這個數組儲存的每個元素都是一個指針,而不是把你列出的所有字符依次儲存在數組中。

[ 本帖最后由 TonyDeng 于 2014-2-12 14:15 编辑 ]

授人以渔,不授人以鱼。
2014-02-12 11:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你運行下面的代碼看看:
程序代码:
    const char* arr[] = { "hello", "world", "xiao", "gang" };
    printf_s("count of arr = %u\n", _countof(arr));
    printf_s("address of arr = %p\n\n", arr);
    for (size_t count = 0; count < _countof(arr); ++count)
    {
        const char* str = *(arr + count);
        for (size_t index = 0; index < strlen(str); ++index)
        {
            printf_s("%p, %c, %s\n", &str[index], str[index], &str[index]);
        }
        printf_s("\n");
    }



[ 本帖最后由 TonyDeng 于 2014-2-12 12:23 编辑 ]

授人以渔,不授人以鱼。
2014-02-12 11:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
留意内存中數據(特別是每個字符)的真實地址,不要想當然用指針直接存取,它們未必是連續的。

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2014-2-12 14:08 编辑 ]

授人以渔,不授人以鱼。
2014-02-12 12:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
把定义改为数组形式是这样的结果:

授人以渔,不授人以鱼。
2014-02-12 14:25
快速回复:关于一个char指针的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021296 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved