| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1142 人关注过本帖
标题:c++,求解释!!!
只看楼主 加入收藏
我有我梦
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:321
专家分:1128
注 册:2013-5-25
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:15 
c++,求解释!!!
#include <iostream>
using namespace std;
int main()
{
    int stu[3];
    stu={0,0,0};   
    cout<<stu<<endl;
    return 0;
}
Microsoft Visual C++ 6.0报错!素组不能先定义,然后再初始化!为什呢?
#include <iostream>
using namespace std;
int main()
{
    char stu[30];
    char *p=stu;
    p="student";
    cout<<p<<endl;
    cout<<stu<<endl;
    return 0;
}
输出结果是:
student
烫烫烫烫烫烫烫烫烫烫
Press any key to continue
指针变量p与字符型素组stu[30]的首元素是同一个地址,那么为什么通过指针变量向字符型素组stu[30]赋值,输出stu时是:烫烫烫烫烫烫烫烫烫烫?
搜索更多相关主题的帖子: Microsoft continue include return 元素 
2013-06-27 14:10
lzj12530
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:264
专家分:841
注 册:2013-3-28
收藏
得分:30 
#include <iostream>
using namespace std;
int main()
{
    char stu[30];
    char *p=stu;    //这一句是将指针p指向数组首地址
    p="student";   //这一句就改变了指针p的指向,指针p重新指向的静态存储去的student字符串
    cout<<p<<endl;
    cout<<stu<<endl;
    return 0;
}              //所以你输出的结果是会出错的

C++菜鸟
2013-06-27 14:51
veketdelphi
Rank: 5Rank: 5
等 级:职业侠客
帖 子:67
专家分:374
注 册:2013-4-8
收藏
得分:20 
stu={0,0,0};    这是数组整体赋值(C/C++不支持这种语法,某些其他编程语言可以这么干)
 数组赋值 只能一个一个元素来

int stu[3] ={0,0,0}; //这是数组定义的时候初始化 ,  
当然如果你不嫌麻烦可以写成
 int stu[3];
stu[0] = 0;
stu[1] = 0;
stu[2] = 0;

初始化值一样,或是某种规律 用循环
 int stu[3];
int i;
for(i=0;i<3;i++)
{
    stu[i] = 0;
}

给你留个 作业  google  memset()的用法


char stu[30];
    char *p=stu; //定义p并使p指向stu[0]
    p="student";//p指向"student"的首地址 即 第一个字符's'的地址,p的指向发生改变,不再指向stu[0]
    cout<<p<<endl;
    cout<<stu<<endl;//stu数组没有 '\0' 导致cout访问数组 越界 放到 stu[29]后面的一串没用的东西了




2013-06-27 14:54
lzj12530
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:264
专家分:841
注 册:2013-3-28
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

C++菜鸟
2013-06-27 14:54
lzj12530
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:264
专家分:841
注 册:2013-3-28
收藏
得分:0 
调试你就发现p实际是指向了静态存储区

C++菜鸟
2013-06-27 14:55
lzj12530
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:264
专家分:841
注 册:2013-3-28
收藏
得分:0 
另外对于你第一个程序 stu={0,0,0};就不能采用对首地址进行这种赋值了,你可以在声明时进行整体赋值。比如stu[3]={0,0,0};这样是可以的

C++菜鸟
2013-06-27 15:05
lzj12530
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:264
专家分:841
注 册:2013-3-28
收藏
得分:0 
字符串乱码是因为刚才将p指向的静态存储区,而stu数组并没有赋值,因此stu里面的内容是不确定的。所以是一群乱码,并且可能没有字符串结束标识符\0那么就会导致数组越界。

C++菜鸟
2013-06-27 15:12
ydown
Rank: 2
等 级:论坛游民
帖 子:31
专家分:92
注 册:2013-5-27
收藏
得分:20 
====================================================
#include <iostream>
using namespace std;
int main()
{
    int stu[3];
    stu={0,0,0};   
    cout<<stu<<endl;
    return 0;
}
------------------------------------------
1.数组的赋值:
    方法1.
        你可以将stu={0,0,0}    //你这样写是错的,非初始化时是不能这样写的.
        改成  for(int i=0;i<3;i++)    //非初始化的写法.
                {
                    stu[i]=0;    //或者直接手动赋值 cout<<stu[i];
                }
    方法2.
        将 int stu[3];
           stu={0,0,0};
        2条语句合并成:
           int stu[3]={0,0,0}    //这个是初始化的写法
2.数组的值输出:
    cout<<stu<<endl;只能返回数组的首地址,
    要输出数组的值得用循环,
    for(int i=0;i<3;i++)
    {
        cout<<stu[i]<<endl;
    }

==================================================
#include <iostream>
using namespace std;
int main()
{
    char stu[30];
    char *p=stu;
    p="student";
    cout<<p<<endl;
    cout<<stu<<endl;
    return 0;
}
---------------------------------------
stu[30]未赋值,所以值是乱码,
正好你可以用例1的问题解决例2的问题.
2013-06-27 15:32
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:15 
百分贴的人好积极啊,汗...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-06-27 15:54
我有我梦
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:321
专家分:1128
注 册:2013-5-25
收藏
得分:0 
peach5460

百分贴的人好积极啊,汗..
没办法!小弟太菜了!这样的问题,如果没有分数,别人就懒得回答了!,以后多指教啊!
2013-06-27 16:44
快速回复:c++,求解释!!!
数据加载中...
 
   



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

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