数组指针和指针数组

阅读量: 125 编辑

一、数组的定义

数组在定义的时候要确定长度,系统要给他分配存储空间(地址)。

//长度为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

爱码岛编程公众号
微信扫码关注
爱码岛编程小程序
微信扫码打开
苏ICP备13052010号
©2023 南京匠成信息科技有限公司