第6章:复合类型

6.1 数组

定义

数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为数组的元素;

可以由除void类型以外的任何一种类型构成;


源由

 


用法

 


简单例子

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;

void ChangeData(int *p)
{
	p[2] = 10;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[3] = {1,2,3};
	int b[2][3] = {{1,2,3},{4,5,6}};
	cout<<"a的最后一个数:"<<a[2]<<endl;
	cout<<"b的第二组的第一个数:"<<b[1][0]<<endl;
	ChangeData(a);
	cout<<"a改变后的数据:"<<a[2]<<endl;
	system("pause");
	return 0;
}	

//输出:
//a的最后一个数:3
//b的第二组的第一个数:4
//a改变后的数据:10
	

详解

1、一维数组的声明使用

类型说明符 数组名[常表达式]

只能逐个引用数组的元素,而不能一次引用整个数组;引用的下标从0开始

2、二维数组的声明和使用

数据类型 标识符[常量表达式1][常量表达式2]

3、数组作为函数参数

数组元素作为实参,与单个变量一样

数组名作参数,形、实参都应是数组名,类型要一样,传送的是数组地址;对形参数组的改变会直接影响到实参数组;


进阶例子收集

 

6.2 指针

定义

指针:变量的地址

指针变量:是用于存放地址的变量;


源由

 


用法

存储类型 数据类型 *指针名 = 初始地址


简单例子


#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A{
public:
	int arg;
};

int _tmain(int argc, _TCHAR* argv[])
{
	int data = 100;
	int *p  = &data;
	cout<<"p指针的内容:"<<data<<endl;
	A aObj;
	aObj.arg = 200;
	void *pObj = &aObj;
	A *obj = (A *)pObj;
	cout<<"指向对象的结果:"<<obj->arg<<endl;
	system("pause");
	return 0;
}

//结果:
//p指针的内容:100
//指向对象的结果:200
	

详解

1、注意:

(1)用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致;

(2)可以用一个已赋初值的指针去初始化另一个指针变量

(3)不要用一个内部auto类型变量去初始化static 类型指针;

(4)允许声明指向void类型的指针,该指针可以被赋予任何类型对象的地址

(5)指针变量的算术运算

[1]指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址;

[2]这种运算的结果值取决于指针指向的数据类型;

[3]指针加一或减一,指向下一个或前一个数据;

[4]*与++优先级相同,自右向左运算:y=*px++;相当于y=*(px++)


进阶例子收集

 

6.3 动态存储分配

定义

动态申请内存操作符 new 类型名(初值列表)

功能:在程序执行期间,申请用于存放类型对象的内存空间,并赋以初值;

释放:delete 指针

功能:释放指针所指向的内存;


源由

 


用法

 


简单例子

	
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
class A{
public:
	int arg;
};

int _tmain(int argc, _TCHAR* argv[])
{
	A *p = new A();
	p->arg = 100;
	cout<<"动态申请空间测试:"<<p->arg<<endl;
	delete p;
	system("pause");
	return 0;
}

 //结果:
 //	动态申请空间测试:100
	

 

详解

1、动态分配数组和释放

char *p = new char[10]; // 分配内存

delete [] p//释放,这里的[]不能少;

2、用new创建多维数组(C语言写法):

以下是申请数组p[2][3]

int **a = new int *[2]; //指针数组,即指向数组的指针;因为指向数组的指针也没有内存空间,需要申请;

for(int i=0; i<2; i++){

a[i] = new int[3]; //一个有2个指针,指针指向的数组也没有空间,所以也需要申请;

}

for(i=0;i<2;i++){

delete []a[i];//先释放数组空间

delete []a;//再释放指针空间

}

3、C++的写法

(1)一维

vectora(2);//a[2]

(2)二维

vector >a(2);

for(i=0;i<2;i++){

a[i].resize(3); //3列

}

最简单的写法:vector >a(2,vector(3));


进阶例子收集

1、int a; int *a; int **a; int(*a)[10]; int (*a)(int );的区别

(1)int a;//表示一个内存空间,这个空间用来存放一个整数(int)

(1)int *a;//表示一个内存空间,空间存放一个指针,这个指针指向一个存放整数的空间

(1)int **a;//这个空间用来存放一个指针,这个指针指向一个存放指针的空间,存放指针指向一个int类型的数;

(1)int (*a)[10];//指针数组,指针指向一个空间长度为10、类型为int的数组;与int **a的区别在于,int (*)[10]指针加1代表指向下一个长度为10的数组

int (*a)(int);//函数指针,指针指向函数,参数为int,返回值为int的函数;

字符串

定义

 


源由

 


用法

 


简单例子


#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	char str[] = "abcd";
	cout<<"字符串:"<<str<<endl;
	system("pause");
	return 0;
}

 //结果:
 //字符串:abcd
	

详解

 


进阶例子收集

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值