| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1945 人关注过本帖
标题:新手请教
只看楼主 加入收藏
joason
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-12-7
收藏
 问题点数:0 回复次数:10 
新手请教
请问高手在下面的程序中:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
    string str="I love football";
    char *p = new char[15];
    strcpy(p,str.c_str());
    cout<<p<<endl<<*p<<endl;
        return 0;
}
为什么p输出的I love football,而*p输出的是I?这里的p不是指针吗?怎么会出现字符数组呢?谢谢!
搜索更多相关主题的帖子: include football 
2008-02-29 22:04
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
    string str="I love football";
    char *p = new char[15];
    strcpy(p,str.c_str());
    cout<<p<<endl<<p[0]<<endl;//*p=p[0]
        return 0;
}
2008-02-29 22:31
joason
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-12-7
收藏
得分:0 
首先谢谢楼上的!
但是p是指针,不是应该存储的是某个地址吗?*p应该是地址的内容也就是
I love football,可是程序输出的是I,这是为什么呀?
2008-02-29 22:45
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
是字符串首地址,你用*号是把地址里面内容取出来...
2008-02-29 23:01
zhoulikelvjj
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2007-4-10
收藏
得分:0 
p是char类型的,*p只是取第一个char字符,所以是I,*(p+1)就是下一个字符了
2008-02-29 23:30
Ethip
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:771
专家分:0
注 册:2008-1-18
收藏
得分:0 
一个不恰当的解释
1、p指的是数组d的首地址,*p = p[0],这个应该是毫无疑问的!所以*p = 'I'

2、一点点内存分配知识!p既是数组的首元素的地址,也是数组对应的字符串的的地址。即p存储着一个字符串!
而C++中,是不检查输出内容(如p)的类型的(即没有格式控制),C就不一样!C++中中根据前面的提示,d时一个字符数组,当输出p是,实际上把它处理成了字符串!(这里的解释不知对不对,我也没有花很多时间在C++上,仅供参考!!)

另外可参考下列程序,注意输出时的格式控制!!
#include <stdio.h>
#include <string.h>
void main()
{
char *s="Golden Global View";
char d[20];
strcpy(d,s);
printf("%s", d);
printf("\n" );
printf("%d", d);
printf("\n" );//这里输出的才是内存地址,因为有严格的格式控制!!
printf("%c", *d);
printf("\n");
}

[[it] 本帖最后由 Ethip 于 2008-2-29 23:51 编辑 [/it]]
2008-02-29 23:47
joason
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-12-7
收藏
得分:0 
楼上的各位朋友说了,p指的是字符数组的首地址,那么*p是不是应该从数组的首地址开始直至遇到'\0'才结束,怎么*p只输出一个字符I?
2008-03-01 09:54
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
数组的首地址和第一个数组元素是重合的.你用*只是取第一个元素
2008-03-01 10:37
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
这要看ostream& operator << (ostream& out,char* p);是如何写的。

#include <iostream>

struct myostream{
}cout;

myostream& operator << (myostream& out,char * p)
{
    std::cout<<"我想输出什么就输出什么\n";
    return out;
}   

int main()
{
    cout<<"Hello world\n";
    system("pause");
}
2008-03-01 13:46
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
楼上得,你的运算符重载不错.它不是类的成员函数,而且你的参数里面已经应用调用了.对于这个例子好像没必要再返回引用了吧?只是问问,个人觉得引用着东西,是实现动态编连比较多,即使用也在=运算重载比较多,这样可以实现动态编联..

[[it] 本帖最后由 sunkaidong 于 2008-3-1 19:20 编辑 [/it]]
2008-03-01 18:03
快速回复:新手请教
数据加载中...
 
   



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

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