目录

零、引言

0.1 学习数据结构,我们要学习哪些方面?

0.2 “数组”这个抽象数据结构的特点

一、C++数组arr[] 的初始化

 1.1成员列表初始化

1.2 用循环赋值的方式初始化 

 1.3 用对下标赋值的方式初始化 

二、数组自身信息

2.1 统计数组的长度(元素个数):sizeof()

2.2地址

2.2.1 数组的首地址: 数组名arr即指向数组首地址

 2.2.2 数组某个元素的地址:&arr[i]

2.2.3整个数组的地址:& arr

 2.2.4 总结

三、 数组的增、删、查、改

3.1 添加一个元素(arr[]不能,vector可以)

3.2 删除一个元素(arr[]不能,vector可以)

3.3 遍历数组(可以),查找一个元素(可以)

3.4 改变元素的值(可以)

四、二维数组(多维数组同理)

4.1 二维数组的初始化

4.1.1成员列表初始化

4.1.2遍历初始化

4.2 二维数组的信息

4.2.1行数、列数、元素个数

4.3 二维数组的遍历数组,查找某个元素,修改元素


零、引言

0.1 学习数据结构,我们要学习哪些方面?

  • 抽象的数据结构
    • 数据结构的物理储存地址
    • 数据结构的逻辑储存
    • 数据结构的操作:增、删、查、改某一元素及其复杂度
  • 具体到某一语言下的数据结构
    • 数据结构的初始化
    • 如何查看一个数据结构自身的一些信息(元素个数、是否为空)
    • 数据的增、删、查、改的方法

0.2 “数组”这个抽象数据结构的特点

1、在物理空间上连续储存。

        坏处:数组的插入和删除时,要对后面的数组元素进行整体的移动。

2、在逻辑上是连续储存的数,可以顺序访问。支持用下标访问,即a[i]的形式(这种访问方式也叫随机访问)

3、遍历数组的复杂度是O(n),随机访问的复杂度是O(1)。

一、C++数组arr[] 的初始化

 1.1成员列表初始化

//定义方式2:数据类型 数组名[元素个数] =  {值1,值2 ,值3 ...};
	//若大括号{ }内的元素个数小于定义的数组长度,则剩余数据默认使用0填充*[图示1]
	int arr2[10] = { 100,90,80,70,60,50,40,30,20,10 };

可以省略数组长度,编译器会自动识别。 


	//定义方式3:
	//数据类型 数组名[] =  {值1,值2 ,值3 ...};
	int arr3[] = { 100,90,80,70,60,50,40,30,20,10 };

1.2 用循环赋值的方式初始化 

int main() {
	int num[10];
	for (int i = 0; i < 10; i++) {
		cin >> num[i];
	}
}

 1.3 用对下标赋值的方式初始化 

int main() {
	//定义方式1:数据类型 数组名[元素个数];
	int arr[10];
	//使用数组下标对数组元素进行赋值或访问
	arr[0] = 10;
	arr[1] = 20;
	arr[2] = 30;
}

 

 

 

二、数组自身信息

2.1 统计数组的长度(元素个数):sizeof()

数组占用内存空间大小:sizeof(arr)
数组单个元素占用内存空间大小:sizeof(arr[0])
数组长度sizeof(arr) / sizeof(arr[0])

代码示例: 

int main() {
    int num1[5] = { 1,2,3 };
    int num2[5];
    int len1=sizeof(num1) / sizeof(num1[0]);
    int len2=sizeof(num2)/sizeof(num2[0]);
    return 0;
}

局部变量结果:

 

可以看到,编程人员即使没有手动赋予一个数组初始值,但只要写明了这个数组的大小n,编译器会默认给它开辟元素大小*n个元素长度的空间,用sizeof也不会报错。

2.2地址

2.2.1 数组的首地址: 数组名arr即指向数组首地址

int main() {
    int num1[5] = { 1,2,3 };
    int* p1 = num1;
    int* p2 = &num1[0];
    return 0;
}

 2.2.2 数组某个元素的地址:&arr[i]

int main() {
    int num1[5] = {1,2,3,4,5};
    int* p1 = num1;
    int* p2 = &num1[0];
    int* p3 = &num1[1];
    int* p4 = &num1[2];
    /*以此类推*/
    return 0;
}

2.2.3整个数组的地址:& arr

注:如果要存放指向整个数组的地址,要用数组指针 typedef (*p)[n];

int main() {
	int num[5] = { 1,2,3,4,5 };
	int(* p)[5] = &num;
}

 2.2.4 总结

举例:获取数组 int arr[5] 的各种地址:

地址指针赋值
数组的首地址 arr 或 &arr[0]int *pint*p=arr;
数组的某个元素的地址 arr[i]int *pint *p=arr[i]
数组的整体地址 &arr;int(*p)[5]int(*p)[5]=&arr;

(1) arr 等价于 &arr[0]

表示数组首元素地址,指向数组第1个元素,arr + 1或&arr[0] + 1会跳过第1个元素【加上1个数组元素的字节数】,指向数组的下1个元素。arr或&arr[0]的地址类型为int *类型,使用int类型的指针(指向数组首元素的指针)接收。

(2) &arr

表示整个数组的地址,指向整个数组,&arr + 1会跳过整个数组【加上整个数组的总字节数】,如int *p = (int *)(&arr + 1),指针p指向数组的末尾。
&arr的地址类型为int (*)[数组长度]类型,使用数组指针(指向数组的指针)接收。

三、 数组的增、删、查、改

3.1 添加一个元素(arr[]不能,vector可以)

3.2 删除一个元素(arr[]不能,vector可以)

3.3 遍历数组(可以),查找一个元素(可以)

int main() {
	int num[5] = {1,2,3,4,5};
	for (int i = 0; i < 5; i++) {
		cout << num[i] << " ";
		num[i] += 10;
	}
}

3.4 改变元素的值(可以)

int main() {
	int num[5] = {1,2,3,4,5};
	num[0] += 10;
}

四、二维数组(多维数组同理)

4.1 二维数组的初始化

4.1.1成员列表初始化

二维数组

int main() {
	int num[3][3] = {
		{1,2,3},
		{4,5,6},
		{7,8,9}
	};
}

三维数组 

int main() {
	int num[2][2][2] = {
		{{1,2},{3,4}},
		{{5,6},{7,8}}
	};
}

4.1.2遍历初始化

二维数组

int main() {
	int num[10][10];
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			cin >> num[i][j];
		}
	}
}

三维数组

int main() {
	int num[10][10][10];
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			for (int k = 0; k < 10; k++) {
				cin >> num[i][j][k];
			}
		}
	}
}

4.2 二维数组的信息

4.2.1行数、列数、元素个数

二维数组

int main() {
	int num2[][3] = { {1,2},{3,4,5} };
	int row = sizeof(num2) / sizeof(num2[0]);    //有多少行
	int size = sizeof(num2) / sizeof(num2[0][0]);//有多少个元素
	int col = size / row;                        //有多少列
}

三维数组同理

4.3 二维数组的遍历数组,查找某个元素,修改元素

int main() {
	int num[10][10];
    //两个for循环遍历二维数组
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			cin >> num[i][j];
		}
	}
    //直接通过下标查找到元素,这种查找方式也叫做随机查找
    num[2][3];
    //修改元素的值
    num[2][3]=100;
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐