距离上次写已经要有一个星期了,下面就来总结一下第二章的知识点吧(学而不思则罔,思而不学则殆)
2.1 c++对c语言数据类型的扩展
c++的语言基本数据类型与c语言一致,但是c++对c语言中的结构联合枚举等自定义数据类型进行了扩展,在c++中结构名 联合名 枚举名都是类型名,可以直接用于变量的声明和定义,即在c++中定义变量时,不必在结构名 枚举名 联合名 前面加上 struct enum union,此外在联合和结构中还可以定义函数。
struct student
{
int number;
char name;
int age;
int getage()
{
return age;
}
};
定义变量
c++ 中:student std1;
c中 :struct student std1;
```
**2.2 局部变量声明**
**2.3 指针**
2.3.1 指针的回顾
指针用于存放一个对象在内存中的地址,通过操作指针间接的操作这个对象。指针的典型用法是建立链接的数据结构或者是用于
函数参数,以便传递数组和大型的类对象。也可以认为指针代表了两个变量,一个是指针本身,另一个是他所指向的变量,有一下几种指针:
int *p;//代表一个指向int的指针
int **p;//指向int指针的指针
int str[10];//指向int指针的数组 注意符号的优先级的优先级更高
int (*f) (int ,char );//f是指向具有两个参数的函数的指针
int *f(int);//f是一个函数,返回一个int类型的指针
2.3.2 指针与0与void*
没有任何变量会被分配到0地址,所以0就可以作为一个指针常亮,与null的含义相同,表明指针当前没有任何变量;
指针具有两个属性,地址和长度,地址大小固定,与类型无关;长度则与指针类型相关这个类型指示编译器怎样解释他所指向的内存区域的内容,以及该内存区域应该跨越多少个内存单元,比如在32位微机上,int,float,double类型的指针都是4字节的地址,但是int类型指针会指示编译器存取连续4字节的内存单元作为一个整数,而double则会存取8个内存单元作为一个双精度浮点数。因此指针变量本身存储的是一个内存地址,其大小是固定的,但是指针类型用于确定如何存取其所指内存区域的数据。于此,c++提供一种无类型指针void*,两个void*指针可以相互赋值,比较相等与否。任何类型的指针都是大小相同的地址,而void*指针仅表示与之相关的值是个地址,因此可以接收任何类型的指针(除函数指针之外)。但是只有显式的将一个void*'转换成某种数据类型的指针之后,才能访问其所指内存区域的数据,其他操作都是不允许的。
#include<iostream>
using namespace std;
int main()
{
int i=4,*pi=&i;
void *pv;
double d=9,*pd=&d;
pv=&i;/*正确 void*指针仅表示与之相关的值是个地址,
因此可以接收任何类型的指针(除函数指针之外)*/
pv=pi;//正确
cout<<*pv<<endl;//错误,
/*但是只有显式的将一个void*'转换成某种数据类型的指针之后,
才能访问其所指内存区域的数据*/
pv=pd;
cout<<*(double *)pv;/*正确,进行显式转换,注意显式转为double**/
}
注意:pv是void*指针,无法确定pv所指内存区域的大小和类型,必须进行强制转换类型之后才可以访问。
void*最主要的用途是作为函数的参数,以便向函数传递一个类型可变的对象,另一种就是从函数返回一个无类型的对象,在使用时再显式转换成适当的对象。
2.3.3 new和delete
指针常与堆空间的分配有关,所谓堆,就是一块内存区域,它允许程序在运行过程中以指针的方式从其中申请一定数量的存储单元(其他存储空间的分配是在编译时完成的),用于程序数据的处理,堆内存也称动态内存。堆内存的管理是由程序员完成。在c语言中,如果需要使用堆内存,程序员可以用函数malloc()来申请,用完之后在用free()将之归还系统,否则会造成内存泄露。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p,i=4,*pi,d=5,*pd,*pc;
p=(int *)malloc(sizeof(int));//从堆中分配一个int对象需要的内存
//并将之转化成int类型
*p=23;
pd=&d;
pi=&i;
pc=pd;
printf("*p=%d *pi=%d *pd=%d *pc=%d",*p,*pi,*pd,*pc);
free(p);//释放堆内存
}
稍后在另一篇文章里在介绍一下指针吧。
malloc()的使用比较麻烦,要计算内存大小,还要对内存进行转换之后才能使用,所以c++中提供了new和delect两个运算符进行堆内存的分配与释放.
(1)new的使用
new的功能类似与malloc的使用,用于从堆中分配指定大小的区域,并返回获得内存区域的首地址。
用法一:p=new type;只分配堆内存
用法二:p=new type(x);x代表参数,代表值的大小,将分配到的 堆内存初始化为x
用法三:p=new type[n];分配具有n个元素的数组。
new可以根据type自动计算分配的内存大小,不用sizeof()计算,如果分配成功,会将得到的堆内存的首地址存放在指针变量p中,如果不成功则返回空指针(0)。
(2) delete的用法
delete 的用法与free()类似,用于释放new分配的堆内存,以便被其他程序使用。
用法一:delete p;
用法二:delete [] p;
其中p是用new分配的对内存空间指针变量,用法1用于释放单个变量,2用于释放动态分配的数组储存区域。
#include <iostream>
using namespace std;
int main()
{
int *p1,*p2,*p3;
p1= new int;//分配一个int类型数据的内存区域
p2= new int(10);//分配一个int类型的内存区域,并将10赋值给她
p3= new int[10];//分配能够存放10个整数的数组区域
if(!p3)//分配不成功就显示错误信息
{
cout<<"error"<<endl;
return 1;//终止程序
}
*p1=5;
*p3=1;
p3[1]=2;
p3[2]=3;
cout<<"p1 address: "<<p1<<" value"<<*p1<<endl;
cout<<"p2 address: "<<p2<<" value"<<*p2<<endl;
cout<<"p3[0] address: "<<p3<<" value"<<*p3<<endl;
cout<<"p3[1] address: "<<&p3[1]<<" value"<<p3[1]<<endl;
delete p1;
delete p2;
delete []p3;
return 0;
}
注意:
1.分配之后赋值是如果是单个数据,则用*p
如果是数组则用数组形式p[i];
2.在显示地址时,如果是单个对象,则直接写指针p
如果是数组的某一个,则要取地址
3.注意数组的开始的第一个元素
4.在删除指针时,如果是数组则 是delete[]p,而不是delete p;
如果是delete p则则只删除了数组的第一个元素。
2.4 引用
2.5 const 常量
2.5.1 常量的定义
2.5.2 constant与指针
2.5.3 const与引用
2.6 类型转换
2.6.1 隐式类型转换
2.6.2 显示类型转换
2.7 函数
2.7.1 函数原型
2.7.2 函数默认参数
2.7.3函数与引用
2.7.4 函数与const
2.7.5 函数重载
2.8 内联函数
2.9 typedef
2.10 命名空间
2.11 预处理器**
2.12 作用域与生命期
2.12.1 作用域
2.12.2变量类型及生命期
2.12.3变量初始化
2.12.4局部变量与函数返回地址
2.13 文件输入与输出
以上内容分开介绍。。。。。。。