c++入门学习(内存与指针及数组)

1. 内存分析与指针
在C++中内存可分为代码区(code)、数据区(分为const、common及data区)、栈区(heap)及堆区(stack动态分配区)。全局变量存放在data区,局部变量存放在栈区,动态变量存放在堆区,函数代码放在代码区。
在c++中,对象可以静态分配,即编译时就申请了内存空间,因此的效率也比较高。
如int ival = 1024,编译时已为ival申请了4个字节(win 32下),初始值为1024,当然还需要在另外一个地方存储这个变量的地址。
char *p = “hello world”,系统在数据区的const区中申请了一块内存,存放字符串 hello word,然后再把该内存的地址赋值给p,而这个内存区对我们来说是只读的,即p[1] = ‘k’这样的操作是错误的。对于字符串常量的引用实质上就是对它的地址的使用,如:
if(“hello” == “hello) cout<<”equal”; else cout<<”not equal”;
程序运行的输出结果为not equal,这是因为对上述两个字符串的比较实质上是对它们所在地址的比较(同样两个数组名的比较也是地址的比较)。同样char *a;a=”hello”;将字符串常量”hello”赋值给指针,实质上是将字符常量所在的地址赋值给指针a。
静态对象与动态分配的两个主要区别是:
(1) 静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接对它进行操作。所谓静态就是编译时就已知道大小不能更改了;
(2) 静态对象的分配与释放由系统自动处理,相反,动态对象的分析与释放,必须由程序员显示管理,所谓动态就是编译和连接时不知道大小,只有运行时才知道大小,可以根据动态分配的这种特点创建动态数组;
动态对象的分配:
int *p = new int[5];
int *p = (int *) malloc(sizeof(int) * 5);
以上这两个语句分配了没有名字的int类型的对象(也就是内存空间,长度为5个sizeof(int)),然后将该对象(或者内存空间)的地址返回给指针p,以后只有通过p才可以对其进行操作。对于动态内存我们需要手工释放它们(使用delete和free分析释放上述的两个内存空间)。
int *p = new int(10)
这也是动态分配,这里的分配一个长度为sizeof(int)的内存,初始化的值为10,并把该内存的地址返回给p,这与上面代码不同,上面的代码分配的是数组,而且不能初始化值。
动态内存分配后,如char *p = new char[10]等,紧接着的语句就是判断内存是否分配成功,如if(p==NULL)。
2. 数组
数组的定义:
//在栈或者全局数据区创建,不需要手工释放空间
char temp[120];
char temp[] = {'a','b'};
char temp[] = “hello”;  //sizeof(temp) = 6; strlen(temp)=5;
 


//在堆中创建,所以需要手工释放
char *p = new char[5]; //创建了一个没有名称char类型的对象,只有通过p指针访问
char *p = (char *)malloc(sizeof(char) * 5);
 


数组的初始化还有一种方法,就是使用void *memset(void ,int,unsigined),第一个参数可以传数组的地址,第二个参数为每个字节的值,第三个参数为字节数,如int a[50]; memset(a,0,50*sizeof(int)),就可以把数组a的所有元素都赋值为0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值