1.数组
1.声明
数组开辟的内存地址是连续的
一维数组
int a[3];//已经开辟内存默认都是 0
int a[3] = {1, 2, 9};
int a[] = {1, 2, 9};
二维数组
int a[2][3];//已经开辟内存默认都是 0
int a[2][3] = {1, 3, 4, 2, 12, 32};
int a[][3] = {1, 3, 4, 2, 12, 32};//3位置不能省略
int a[2][3] = {{1, 3, 4} {2, 12, 32}};//标准写法
2.数组函数参数
作为函数参数传递的是地址
int add(int a[]){
//可以改变 a 里的值
}
void main(){
int a[] = {1, 3, 4};
add(a);
}
3.对象数组
自定义数据类型数组,对象、结构体等
//调用有参数的构造函数
Name A[2] = {Name(2, 3), Name(1,2)};
//默认初始化调用 {Name(), Name()}
Name A[2];
2.指针
地址:地址编码的最基本单位是字节,每个字节由8个二进制位组成,每个字节是基本的内存单元有一个地址。
1.取内存数据
1.变量名
变量名是地址的别名,可得到地址,直接取数据(int a; &a)
2.地址
可以直接取内存数据
3.指针
指针里存放的是地址,再通过地址找数据,属于间接取数据(int *p; *p)
2.指针类型
指针可以指向任意数据类型。
1.声明:int *p;
2.声明指针类型时信息
- 类型需要的内存空间 int
- 限定了此类型能进行哪些运算操作 int char…
- 指针地址里有很多数据,根据不同数据的长度去取,取出后在强制转换成特定的类型
* 和 &
1.声明语句
int *p;
int *p = &a;
int a = 5;
int *p;//声明是一个指针
int *p = &a;
int &b;//声明引用不行
2.执行语句
*p = a;
p = &a;
int a = 5;
int *p;
*p = a;//执行地址内容
p = &a;//&取地址
3.野指针
int *p; 随机分配一个地址给 p
*p; 按照int类型长度为4字节,取 p 地址的内容,野指针不一定取的是什么
避免野指针:int *p = 0;
4.void指针
指针就是存放地址的,内存是固定的 1 字节,
3.指针运算
int *p;//int 类型占4个字节
p++; p+1; //p向后移动4个字节
short *s;//short 类型栈2个自己
s++; s+1;//s 向后移动两个字节长度