幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2242|回复: 3

[通用编程] 又来指针问题

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-7-10 14:51:00 | 显示全部楼层 |阅读模式
main()
{
   char *name[3];char arr[3]={'a','b'};
   name[0]=&arr[0];
   printf("%c",*name[0]);
}
为什么当写成*name[1] 就无法正常输出呢?name[0]=&arr[0];不是已取得数组的首地址了吗?
如果想得到数组首地址,并通过改变 name[]里的下标就可以把数组arr的元素输出应该怎么写法呢?[s:7]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-7-10 15:27:00 | 显示全部楼层
- -
前面那个是指针数组,就是说,数组里,三个元素都是指针.
当你name[0] = &arr[0]时,就意味着,name[0]这个指针,指向了arr[]这个数组的头.但是,这和name[1]有什么关系呢?name[1]依旧是一个空指针.
此时你获得的结果是name[0] = "ab";
name[1] = NULL;

改成这样,可以获得你所需要的结果,
    int i = 0;
    char *name[3];char arr[3]={'a','b'};
    for (i = 0; i < 3; ++i)
    {
        name[ i ]=&arr[ i ];
    }
    printf("%c",*name[0]);
但是注意的是,内容并非你所想象的
你可能存在的想象是name[0] = 'a';
name[1] = 'b';
name[2] = NULL;

实际上是
name[0] = "ab"
name[1] = "b"
name[2] = NULL; (不确定指向何处)

原本一个是char*的指针数组,一个是 char的数组,本身类型就不同.

另外,你可以考虑下这样的结果,你就知道如何得到希望的结果了
    int i = 0;
    char *name[3];char arr[3]={'a','b'};
    for (i = 0; i < 3; ++i)
    {
        name[ i ]=&arr[ i ];
    }
    printf("%c",++(*name[0]));

刚才我又发现一个有趣的问题,因为char& arr[0]和&arr[1]都指向同一块静态存储区,结果导致arr[2]也出现了很有规律的变化.
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-7-10 17:07:12 | 显示全部楼层
我定义的只是字符,但为什么会输出字符串呢?我以TC上运行是只输出一个字符 [s:3]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-7-10 17:34:24 | 显示全部楼层
string 串,本身就是char类型的一个数组,这俩是完全相等的.
输出是一个字节,不代表指针指向的是一个字节
例如最简单的
    char* p = "abc";
    printf("%c",*p);
输出照样是a,因为指针现在处于字符串的首字母这里,你要求输出char(%c),自然是a咯.

所以,我建议你++p看看,就容易清楚了\\一些了. [s:2]
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-2 19:51 , Processed in 0.022167 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表