参考:C++Primer.Plus(第6版)
P88-119
一.结构与枚举
#include "stdafx.h"
#include <iostream>
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 <iostream>
#include <string>
#include <cmath>
#include <climits>
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;
}