| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1058 人关注过本帖
标题:请看代码,问题也在代码中
只看楼主 加入收藏
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:12 
请看代码,问题也在代码中
程序代码:
#include<iostream>
using namespace std;
char* getStr1();
char* getStr2();
char* getStr1()
{
    char* p1;
    p1="asdbsd";
    return p1;
}
char* getStr2()
{
    char* p2;
    p2="asdbsd";
    return p2;
}
int main()
{
    char *p1=getStr1();
    char *p2=getStr2();
    cout<<"p1:"<<p1<<" p2:"<<p2<<endl;//p1、p2存的是地址,所以猜想应该输出的是地址(且应该地址相同),结果输出了预设定的字符串asdbsd
    cout<<"*p1:"<<*p1<<" *p2:"<<*p2<<endl;//愿意是用*操作p1、p2指向的内存块,猜想应该都输出asdbsd,结果都输出了a;
    cout<<"&*p1:"<<&*p1<<" &*p2:"<<&*p2<<endl;//由上一行,如果*p1和*p2找到的是a,那再在前面加&取到的应该是全局区中asdbsd的地址了吧(或者说应该是a的地址),结果输出是asdbsd。
    //今天学内存四区的划分和指针的东西遇到一点不懂的,就自己试了试,结果,我已经完全晕了,请知道的人帮我解释解释
    return 0;
}


[此贴子已经被作者于2015-11-30 17:47编辑过]

2015-11-30 17:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
你C学的太好了

授人以渔,不授人以鱼。
2015-11-30 18:59
rolimi
Rank: 4
等 级:业余侠客
威 望:1
帖 子:43
专家分:232
注 册:2015-6-10
收藏
得分:15 
cout遇到char*时会默认把它当成C字符串,输出直到遇到\0为止。想输出地址可以强制把char*转成void*

呆呆的逗比程序猿
2015-11-30 19:14
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 2楼 TonyDeng
版主大人,比嘲笑更好的是教导
2015-11-30 19:52
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 3楼 rolimi
谢谢
2015-11-30 19:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wengbin在2015-11-30 19:52:00的发言:

版主大人,比嘲笑更好的是教导

你照这条路走下去,教你就是害你。

授人以渔,不授人以鱼。
2015-11-30 20:07
wengbin
Rank: 10Rank: 10Rank: 10
来 自:陕西西安
等 级:贵宾
威 望:19
帖 子:370
专家分:1846
注 册:2015-5-8
收藏
得分:0 
回复 6楼 TonyDeng
你好,我是直接学的C++,一直是自学的,这两正好在学网上下载的一套C语言学习视频,听您这么说,我很不解,还请您告诉我一下我应该怎么学,谢谢
2015-11-30 20:24
孤狼123
Rank: 1
等 级:新手上路
帖 子:8
专家分:4
注 册:2015-11-8
收藏
得分:0 
同时天涯沦落人啊,我也在自学c++,可感觉有一点难,可否留下联系方式平时一起交流交流心得?
2015-11-30 21:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wengbin在2015-11-30 20:24:10的发言:

你好,我是直接学的C++,一直是自学的,这两正好在学网上下载的一套C语言学习视频,听您这么说,我很不解,还请您告诉我一下我应该怎么学,谢谢


你先参考一下这个链接:https://bbs.bccn.net/thread-459714-1-1.html
在C++的思想中,是不鼓励再使用诸如cz字符串、数组、地址那样的东西的,而你现在却在钻研这些。

授人以渔,不授人以鱼。
2015-11-30 21:59
农民工
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:109
专家分:639
注 册:2015-8-22
收藏
得分:0 
    cout<<"p1:"<<p1<<" p2:"<<p2<<endl;//p1、p2存的是地址,所以猜想应该输出的是地址(且应该地址相同),结果输出了预设定的字符串asdbsd
-->其他都对,就是括号里的是错误的(程序编译后 p1="asdbsd";这个asdbsd 占用一段存储区,p1就是指向这段内存,同理 p2="asdbsd";这个asdbsd 也占用一段存储区,只是碰巧这2段内容一样罢了,但占据的地址确实是2个地址段(严格说 ,我的解释还是有问题,但你现阶段不用理会其中的毛病))

    cout<<"*p1:"<<*p1<<" *p2:"<<*p2<<endl;//愿意是用*操作p1、p2指向的内存块,猜想应该都输出asdbsd,结果都输出了a;
-->*p1 只取出一个char类型 ;*p2 只取出一个char类型,即这段内存的第一个char数据

    cout<<"&*p1:"<<&*p1<<" &*p2:"<<&*p2<<endl;//由上一行,如果*p1和*p2找到的是a,那再在前面加&取到的应该是全局区中asdbsd的地址了吧(或者说应该是a的地址),结果输出是asdbsd。
-->*p1 是取p1指向内存区的第一个字符(a),&*p1,就是第一个字符所在的地址,还是“asdbsd”首地址,于是cout作为字符串处理(显示整段字符串内容)
2015-12-01 14:53
快速回复:请看代码,问题也在代码中
数据加载中...
 
   



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

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