一、数组的定义
数组在定义的时候要确定长度,系统要给他分配存储空间(地址)。
//长度为10的数组,里面存储的元素(数据)分别是10、20、30、... 100
int a[5] = {10,20,30,40,50,60,70,80,90,100};
int a1[10] = {100}; //长度为10的数组,第1个元素的数据为100,其他默认都是 0
//虽然没有定义数组长度,但是编译器会根据后面元素的个数算出数组长度是5
int a3[] = {10,20,30,40,50};
数组是这样存储的,是连续的地址空间。
数组在内存中是连续的,数组是通过下标访问的(下标从0开始)。
a[3] //取的是下标是3的值
&(a[3]) //取的是a[3]对应的地址值
二、数组指针
数组定义的时候, a 作为数组名,指向的是数组的首地址,它本身就是一个指针。
int *p;
p = a; //指针赋值
a[0] 是数组的第一个元素,它的地址和 a 是一样的,所以也可以通过取 a[0] 的地址值,赋值给指针。
int *p;
p = &(a[0]) // &a[0]
所以,p、arr、 &(arr[0])
三者等价,都代表了 数组的首地址。
int *p;
p = &(a[0]) // &a[0]
也可通过 p 访问数组中其他元素。
#include <iostream>
using namespace std;
int main(){
int a[10] = {10,20,30,40,50,60,70,80,90};
int *p = &(a[0]); // *p = a
cout << p[5] << endl; //可以通过p访问数组
return 0;
}
三、指针数组
指针数组本质是一个数组,只是它的元素类型是指针。
#include <iostream>
using namespace std;
int main(){
int a = 10;
int b = 20;
int* arr[2] = {&a, &b};
cout << arr[0] << endl; //取a地址
cout << *arr[0] << endl; //取a值
//下面这句话对吗?
int **p;
p = arr;
cout << *p[0] << endl; //取a值
return 0;
}
arr 是指针的数组,所以将它赋值给p的时候,p必须是指针的指针。int *p
表示int的指针,所以是**p
。