| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5631 人关注过本帖, 5 人收藏
标题:内存分配详解(对内存有疑惑的进来看看)
只看楼主 加入收藏
刚开始吧
该用户已被删除
收藏
得分:0 
回复 9楼 最近不在
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-06 13:04
丁宝青
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-12-30
收藏
得分:0 
好东西,我得好好学习学习。
2010-06-06 15:45
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:0 
写的好!顶
2010-06-06 19:38
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
收藏
得分:0 
程序代码:
void fun1(char a[100])    //这里数组退化为指针。
{
    cout<<sizeof(a)<<endl;    //a变为指针,求出4
}

void fun(char (&a)[100])    //将形参声明为引用,不退化  
{
   
    cout<<sizeof(a)<<endl;  //求出100   
}
2010-06-07 00:46
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
收藏
得分:0 
int main(int argc, char* argv[])
{
        short n = 5;
        
        char nc[] = "asdf";
        
        cout<<sizeof(n)<<endl;    //short的字节长
        cout<<sizeof(&n)<<endl;   //指针的字节长
        
        cout<<nc<<endl;  //1    //可能由于重载缘故,从nc所指向的地址开始输出对应的char字符,直至'\0',注意这里输出的不是16进制地址值
        cout<<&nc<<endl;  //2   //这里为地址值。所指向对象为'a'
        cout<<&nc[0]<<endl; //3  //同样&nc[0]为地址值,与1一样。因此输出的为字符串。只是在意义上有点区别,前者为字符串首地址,后者为第一个元素的地址
        
        cout<<(int *)nc<<endl; //4  //由于字符数组的特殊性,需要显示转换,才能输出地址值
        cout<<(int *)&nc<<endl; //5   //由于&nc本身就已经是一地址值,用此这里的类型转换没多大意义,结果与2一模一样
        cout<<(int *)&nc[0]<<endl; //6 //参照1与3,6与4类似
        
        cout<<sizeof(nc)<<endl;     //5  数组名并不是指针
        cout<<sizeof(&nc)<<endl;    //5                                
        cout<<sizeof(&nc[0])<<endl; //4. 因为nc[0]为一个字符对象。&nc[0]就是一地址值(指针).所有指针值都为4。
        nc[2] = 'A';

        char* p = "Hello World1";
        p[2] = 'A';


    return 0;
}

分析:nc,&nc都有2种理解,一个就是"16进制地址值"ox0012ff3c,一个是字符串"asdf".这2种是一个意思,前者是在系统中表现形式,后者为人们所熟知的表示形式
就像10,在计算机中是以2进制存储的。但nc,和&nc的区别在于,nc指向的对象为'a' 's' 'd' 'f' '\0',一个连续的整体。而&nc所指向德为'a'
我们无法通过&nc这种方式来修改nc("asdf")内的内容,因为"ox00123ff3c",因为它是常量,只能读,不能修改。但我们可以像nc[2] = 'A';
这样修改nc的内容。这并没有改变"asdf"改变。而是将"asAf"赋给了数组nc。
说通俗点。如int n = 12; 我们不能将12改成1,再赋给n,这是不现实的。但我们可以直接将1赋给n。

char* p = “Hello World1”;
p[2] = ‘A’;
p也同样2种理解。一个就是"16进制地址值,一个是字符串“Hello World1”。类似于上面的&nc,p指向的为H,因此我们通过p[2]修改字面值是不正确的。
这个例子再一次说明了这一点....指针这样用是错的。。。
typedef就是一种简化数据类型的方法,便于理解。
typedef char* p pstr;
pstr = “Hello World1”;
2010-06-07 00:47
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
收藏
得分:0 
自己裹了半天,也不知道说清楚了没...
2010-06-07 00:47
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
收藏
得分:0 
回复 11楼 刚开始吧
程序代码:
// Note:Your choice is C++ IDE
#include <iostream>
using namespace std;
int main()
{
    int *p = new int(10);
    int *pTemp = p;
    delete [] p;
   
    p = new int[2];
    *p = *pTemp;  //这一步错误。pTemp,p指向同一块内存,被清空。这种错误常见于字符串重新分配空间。这里简化了下例子
    *(p+1) = 3;   //如我们想将cha a[2] = "abcdef"; 变为a[3] = "abcdefg";这种情况 。就需要另外给一片堆内存是最好的
   
    return 0;
}
我没表达清楚,不好意思。

[ 本帖最后由 最近不在 于 2010-6-7 00:59 编辑 ]
2010-06-07 00:58
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以后不是原创的时候,直接贴个连接就可以了。
2010-06-07 20:00
刚开始吧
该用户已被删除
收藏
得分:0 
回复 18楼 Devil_W
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-09 12:27
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用刚开始吧在2010-6-9 12:27:52的发言:

你别光说,自己也放几个经典的东西,让我们这些初学者看看学学。


我经典的东西多的是,你自己不会去搜?

ps:我以前的ID是wxjeacen
2010-06-09 12:43
快速回复:内存分配详解(对内存有疑惑的进来看看)
数据加载中...
 
   



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

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