您的位置:首页 > 编程语言 > C语言/C++

C++回顾(二)——C++数据类型及指针

2015-04-14 09:26 579 查看
一、计算机存储数据时,我们需要关注的是:数据存放何处;数据的值是多少;数据的结构是什么样的(数据类型)

二、C++有一些内置类型,这些类型是自定义类型的基础

三、C++的内置类型有两种,一种是基本类型,一种是复合类型。基本类型包括整形、浮点型等数值类型;复合类型包括数组、字符串、指针、结构

四、C++变量声明时即分配了空间

#include<iostream>

using namespace std;

class test

{

public:
int a;
int b;

};

void main()

{
int a;
cout << &a << endl;
cout << sizeof(a) << endl;
a = 5;
cout << &a << endl;
cout << sizeof(a) << endl;

test t;
cout << &t << endl;
cout << sizeof(t) << endl;
t.a = 1;
t.b = 1;
cout << &t << endl;
cout << sizeof(t) << endl;

}



五、基本类型

1、整形:char,short,int,long,long long(C++ 11)

#include<iostream>

using namespace std;

void main()

{
char a;
cout << "int lenth is " << sizeof(a) << endl;
short b;
cout << "short lenth is " << sizeof(b) << endl;
int c;
cout << "int lenth is " << sizeof(c) << endl;
long d;
cout << "long lenth is " << sizeof(d) << endl;
long long e;
cout << "long long lenth is " << sizeof(e) << endl;

}



*关于sizeof关键字的用法

如果是判断类的长度,则sizeof(className);如果是判断变量的长度,则sizeof valueName。

#include<iostream>

using namespace std;

void main()

{
cout << sizeof 5 << endl;

}

结果是:4

*可以通过#include<climits>(此文件由编译器厂商提供)来获得系统中各整形类型的极值





*变量定义之时必须赋初值

虽然这不是强制要求的,但是非常必要。由于C++语言定义变量即意味着分配了内存空间,所以如果没有赋初值的话,变量的值将是创建变量之前内存单元残存的值,这是不确定的。

2、整形字面值

非零数字开头:十进制

零x开头:十六进制。如,0x10表示16;0X20表示32

零开头:八进制

六、复合类型:数组、字符串

1、数组类型由两个关键信息定义:首元素的指针,数组长度。

#include<iostream>

#include<climits>

using namespace std;

void main()

{

int a[5] = { 1, 2, 3, 4, 5 };
int b[4] = { 0 };
int c[] = { 5, 4, 3, 2, 1 };

if (typeid(a) == typeid(int*))
cout << "true" << endl;
else
cout << "false" << endl;

if (typeid(a) == typeid(b))
cout << "true" << endl;
else
cout << "false" << endl;

if (typeid(a) == typeid(c))
cout << "true" << endl;
else
cout << "false" << endl;

int* aa = a;
cout << a[3] << " " << aa[3] << endl;

}



2、string是是特殊的字符串数组

#include<iostream>

#include<climits>

using namespace std;

void main()

{
char a[] = { 'a', 'b', 'c', 'd' };
cout << a << endl;
char b[] = { 'a', 'b', 'c', '\0' };
cout << b << endl;
string c = b;
if (typeid(c) == typeid(b))
cout << "true" << endl;
else
cout << "false" << endl;
cout << b[1] << " " << c[1] << endl;
cout << b[3] << " " << c[3] << endl;

}



七、自定义数据类型

1、结构

结构可以近似看做class,两者唯一不同是默认访问控制。在没有显式指明的情况下,struct默认是public的,class默认是private的。

八、指针和自由存储空间

1、指针释放

a、delete关键字

delete关键字可以将new关键字索取的内存空间归还给内存池。对指针变量使用delete时,只会将指针所指向的内存空间还给内存池(即指针内的地址值清空,原地址内的值清空),而不会删除指针变量本身,可以继续为指针new新的空间。

#include<iostream>

#include<climits>

using namespace std;

void main()

{
int* a = new int(123);
int* b = a;
cout << a << endl;
cout << b << endl;
cout << *a << endl;
cout << *b << endl;
cout << "-----------------" << endl;
delete a;
cout << a << endl;
cout << b << endl;
//cout << *a << endl; //语句非法
cout << *b << endl;

}



*不能delete一个已经被delete且尚未分配内存空间的指针重复delete

*不能使用delete释放一个声明变量所获得的内存,比如int a= 1; int* pa = &a; delete pa; //这是不允许的。

2、使用new关键字创建动态数组



总结delete的使用:

a、不能通过delete释放非new分配的内存

b、不能重复释放内存

c、new[ ]创建的数组应该通过delete[ ]释放

d、对空指针(NULL)使用delete是安全的

3、数据存储

C++有3种管理数据内存的方式:自动存储、静态存储、动态存储

a、自动存储

代码块内部常规定义(不使用new关键字)的变量使用自动存储空间,这些变量称为自动变量。这意味着它们在所属的代码块被调用时自动产生,在函数结束时被销毁。

自动变量通常存储在栈区。当执行代码块时,这些变量依次进栈;在离开代码块时,这些变量反向被依次销毁。

b、静态存储

静态存储是整个程序执行过程中都存在的存储方式。两种情况下会产生静态存储:在函数体外定义的全局变量;声明为static的变量

自动存储的变量只能在特定的代码块被执行时存在,静态变量可能存在于程序的整个生命周期。

c、动态存储

动态存储是new和delete运算符提供变量存储方式。它们管理了一个内存池,这个内存池被称为自由存储空间(或者堆区)。自由存储空间与其他内存空间(存储静态变量和动态变量)是分开的。自由存储的变量完全需要手动建立和释放,变量的生命周期完全不受程序或者代码块生存时间控制(指针变量本身一般是自动存储的变量,受到代码块生存时间控制,但是指针指向的空间是需要手动管理的)。

指针变量受到自动存储规则的控制被销毁,但是其指向的自由存储空间的内存没有被释放,这种现象叫做内存泄漏。泄漏的内存将持续被浪费。

4、指针和const

a、指向常量的指针(防止该变量被指针修改)

int a=100;

const int * pa = &a;

*注意,int a 仅仅是不能通过pa修改,但是可以通过其他方式修改,例如 a++ 仍然是合法的。

*注意,指向常量的指针只能防止指针指向的值,但是指针本身的值时可以改变的。例如对pa重新赋值是合法的,int b = 200; pa = &b;

*注意,常量只能被指向常量的指针指向;不能被常规指针指向。例如,const int a= 100; const int * pa = &a; //这是合法的。const int a= 100; int * pa = &a; //这是非法的。

b、将指针本身声明为常量(防止改变指针指向的位置)

int a = 100;

int * const pa = &a;

*虽然不能改变pa指向的位置,但是可以通过pa改变a的值。

5、void指针

指针有两个属性:地址和单位大小。例如

int a=100;

int * pa= &a;

指针pa一方面指出变量a的地址,另一方面也指出位于这个地址的变量单位大小是4字节(int是4字节)的。

而void指针只有地址这一个属性!任何指针都可以赋值给void指针!void指针赋值给其他类型的指针时都要进行转换!

6、new关键字内存分配失败
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++