注册 登录
编程论坛 C++教室

新手请教

joason 发布于 2008-02-29 22:04, 1947 次点击
请问高手在下面的程序中:
#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不是指针吗?怎么会出现字符数组呢?谢谢!
10 回复
#2
sunkaidong2008-02-29 22:31
#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;
}
#3
joason2008-02-29 22:45
首先谢谢楼上的!
但是p是指针,不是应该存储的是某个地址吗?*p应该是地址的内容也就是
I love football,可是程序输出的是I,这是为什么呀?
#4
sunkaidong2008-02-29 23:01
是字符串首地址,你用*号是把地址里面内容取出来...
#5
zhoulikelvjj2008-02-29 23:30
p是char类型的,*p只是取第一个char字符,所以是I,*(p+1)就是下一个字符了
#6
Ethip2008-02-29 23:47
一个不恰当的解释
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]]
#7
joason2008-03-01 09:54
楼上的各位朋友说了,p指的是字符数组的首地址,那么*p是不是应该从数组的首地址开始直至遇到'\0'才结束,怎么*p只输出一个字符I?
#8
sunkaidong2008-03-01 10:37
数组的首地址和第一个数组元素是重合的.你用*只是取第一个元素
#9
leeco2008-03-01 13:46
这要看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");
}
#10
sunkaidong2008-03-01 18:03
楼上得,你的运算符重载不错.它不是类的成员函数,而且你的参数里面已经应用调用了.对于这个例子好像没必要再返回引用了吧?只是问问,个人觉得引用着东西,是实现动态编连比较多,即使用也在=运算重载比较多,这样可以实现动态编联..

[[it] 本帖最后由 sunkaidong 于 2008-3-1 19:20 编辑 [/it]]
#11
newyj2008-03-01 20:51
好象 只有 char类型的数组 才能 用 P首地址 来输出整个字符串
而*P在这里 就只能 是第一个 字符了
不知道 理解 是否正确
1