【C++ Primer】第四章学习笔记 (复合类型)(二)

2014-11-24 12:17:31 · 作者: · 浏览: 5
band=2; //invalid 将整型赋值给枚举类型将导致类型错误

int color=2+red// valid 结果为int型,2

band=band(2);//按照{two=2} band=two; 可以通过强制转换的方式 将整型 转化为 枚举类型

4,指针和自由存储空间

1)用法: int a=6;

int *p;// ‘*p’ 表示存储在p地址处的值

p=&a;//指针为p,存储的是值的地址,而不是值本身。

或者写为:int* p=&a;//将指针 p的值设置为&a 而不是将 *p的值

2)指针的危险

long * length;

*length=25365;//length 确实是一个指针,但是没有说明指向哪里,原因是没有初始化指针length

3) new/delete申请与释放内存

int * pn=new int ;//分配int型内存,然后把该内存块地址赋值给指针

*pn=100;//给声明的内存单元赋值

delete pn;//释放pn指向的内存单元,不会删除pn指针本身(pn可以指向另一个新分配的内存块)

【注意】不要尝试释放已经释放的内存块,delete pn;之后再delete pn 会有意想不到的错误

不能使用delete释放声明变量所获得的内存(只能释放new申请的)int *p=&a;//不能delete

4)new创建动态数组

int *a=new int[100];

delete [] a;//[]告诉程序释放的是数组

【原则】

不要使用delete释放不是new分配的内存

不要使用delete释放同一个内存块两次

如果使用new[ ]为数组分配内存,则应使用delete[ ]来释放

如果使用new 为变量分配内存,则应使用delete来释放内存,对空指针应用delete是安全的

五,指针、数组和指针算术

1,double a[3]={100,200,300};

double *p=a;//p指针指向的是数组a的第一个元素的地址

cout<<"地址为:"<

说明:p+1 增加的量等于 p指针指向类型的字节数(double 8字节)

C++将数组名解释为数组第一个元素的地址

2,sizeof作用于 数组显示数组占用的字节数,作用于指针显示指针长度

程序:

[html]
#include "stdio.h"
int main()
{
double a[3]={100.0,200.0,300.0};
double *p=a;
printf("显示数组占用字节数:%d\n",sizeof(a));//输出24=3*8
printf("显示指针个数:%d\n",sizeof(p));//输出4=3个可见元素加上一个结束符
}
3,数组名是第一个元素地址,但是cout对象认为char 数组的地址为字符串地址

程序:

[html]
#include "stdio.h"
#include
using namespace std;
int main()
{
double a[3]={100.0,200.0,300.0};
char b[5]="rose";
cout<<"打印double型数组名a:"< cout<<"打印char型数组名b:"< }
cout 输出char数组时,从第一个字符元素输出一直到遇到空字符'\0'

4,不要使用常量和未被初始化的指针来接受输入

char *p;

const char *a="rose";

cin>>p;//不正确

cin>>a;//不正确

5,一个使用new和delete的程序范例

[html]
#include "stdio.h"
#include
using namespace std;
char *getname();
int main()
{
char *name;
name =getname();
cout< delete []name;

name =getname();
cout< delete []name;
}
char *getname() //如果要建立大量数组的时候,可以根据要存储变量的大小动态分配内存大小
{
char temp[80];
cout<<"Enter last name:";
cin>>temp;
char *pn=new char[strlen(temp)+1];
strcpy(pn,temp);
return pn;
}
程序说明:两次输出的地址是一样的。如果去掉delete []name 则 已经使用但未被释放的地址无法使用


摘自 小田的专栏