[C++基础]结构、枚举与指针

参考:C++Primer.Plus(第6版)

P88-119


一.结构与枚举

#include "stdafx.h"
#include 
using namespace std;

///////////////////////////////////////////结构
struct A
{
	char name[20];
	float volume;
};

struct B
{
	char key[13];
	int car;
} b, b2;//定义结构,同时创建结构变量


///////////////////////////////////////////枚举
enum Color
{
	red, //对应整数值0,并依次递增
	yellow,
	green,
};

enum
{
	n1,n2,n3
};//如果打算只使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称


///////////////////////////////////////////
//1.结构的基本使用
void A1()
{
	A a = { "heheda", 1008.6 };//结构变量的初始化
	A a2 { "people", 123 };//c++11特性,可省略等号

	cout << a.name << " " << a.volume << endl;//heheda 1008.6
	cout << a2.name << " " << a2.volume << endl;//people 123

	a2 = a;//结构赋值
	cout << a2.name << " " << a2.volume << endl;//heheda 1008.6

	
	A aa[2] = { { "12", 34 }, { "56", 78 } };//结构数组

	cout << endl;
}


//2.枚举的基本使用
void A2()
{
	Color c = green;
	cout << c << endl;//2 枚举可转换为int,但int不能转换为枚举(除非强制转换)
	c = Color(0);
	cout << c << endl;//0
	
	cout << endl;
}


int main()
{
	A1();
	A2();

	getchar();
	return 0;
}


二.指针

#include "stdafx.h"
#include "stdlib.h"
#include 
#include 
#include 
#include 
using namespace std;

//1.指针的基础使用
void A1()
{
	int a = 6;
	int* p_a = &a;//&a,即a的地址

	cout << a << endl;//6
	cout << &a << endl;//0030FE20
	cout << p_a << endl;//0030FE20

	*p_a = *p_a + 1;//*p_a,即取出p_a所指的值
	cout << a << endl;//7

	cout << endl;
}


//2.new 与 delete
void A2()
{
	//一般的值变量,其值存储在栈(stack)的内存区域
	//而new 是从堆(heap)的内存区域分配内存

	int* pt = new int;//分配一块int大小的内存,并用指针指向它
	*pt = 1000;
	cout << *pt << endl;//1000
	//释放内存,与new配合使用,但不会删除指针pt本身
	//一定要配对地使用new和delete,否则会发生内存泄漏
	delete pt;

	int* pt2 = new int;
	delete pt2;
	//delete pt2;//错误,不要释放已经释放的内存

	int a = 66;
	pt2 = &a;//正确,delete不会删除指针本身,还可以继续使用
	//delete pt2;//错误,因为释放的内存不是由new分配的

	cout << endl;
}


//3.指针与数组
void A3()
{
	//通常,对于大型数据(如数组、字符串和结构),应使用new

	int* psome = new int[10];//指针指向第一个元素,可当作数组名使用
	psome[0] = 1;
	psome[1] = 2;
	psome[2] = 3;
	cout << *psome << " " << psome[0] << " " << psome[1] << endl;//1 1 2
	psome = psome + 1;//数组名不可这样,而指针是变量,可以这样;数组名是地址
	cout << psome[0] << " " << psome[1] << endl;//2 3
	psome = psome - 1;//注意要恢复
	delete[] psome;

	cout << endl;

	//总结:
	//1.不要使用delete来释放不是new分配的内存
	//2.不要使用delete释放同一个内存块两次
	//3.如果使用new[]为数组分配内存,则应使用delete[]来释放
	//4.对空指针应用delete是安全的
}


//4.指针与数组(2)
void A4()
{
	//指针与数组名的主要区别为:
	//指针的值可以修改,而数组名为常量

	double a[] = { 100.86, 100.87, 100.88 };
	short b[] = { 4, 5, 6 };

	double* pa = a;//数组名是数组第一个元素的地址
	short* pb = &b[0];

	pa++;
	pb++;
	cout << pa[0] << " " << pa[1] << endl;//100.87 100.88
	cout << pb[0] << " " << pb[1] << endl;//5 6
	cout << *b << " " << *(b + 1) << endl;//4 5   *(b + 1)等价于b[1]
	cout << sizeof(b) << " " << sizeof(pb) << endl;//6 4

	cout << endl;
}


//5.指针与字符串
void A5()
{
	//char数组名、char指针以及用引号括起的字符串常量都被解释为:
	//字符串第一个字符的地址
	//字符串是常量

	char animal[20] = "bear";
	char* bird = "wren";

	cout << animal << " " << bird << endl;//bear wren
	//cin >> animal;//fox
	//getchar();
	cout << animal << " " << (int*)animal << endl;//fox 地址

	cout << endl;
}


struct MyStruct
{
	string name;
	float volume;
};

//6.指针与结构
void A6()
{
	MyStruct* ps = new MyStruct;
	ps->name = "hi";
	(*ps).volume = 123;
	cout << ps->name << " " << ps->volume << endl;//hi 123

	cout << endl;
}


int main()
{
	A1();
	A2();
	A3();
	A4();
	A5();
	A6();

	getchar();
	return 0;
}


你可能感兴趣的:(C++基础)