C++ 学习(五)数组(一维数组、二维数组)

21 篇文章 10 订阅
本文深入探讨了C++和Go语言中的一维和二维数组。从定义方式、赋值方法到内存占用分析,详细阐述了两种语言在数组操作上的异同。示例代码展示了不同初始化方式下的数组使用,并通过内存地址展示了数组元素的存储关系。
摘要由CSDN通过智能技术生成

数组

数组就是一个集合,里面存储相同类型的数据元素。

特点:

  1. 数组中每个元素都是相同的数据类型
  2. 数组是由连续内存位置组成
  3. 数组名是常量,不能对数组名进行赋值操作 

一维数组

C++ 一维数组

三种定义方式

  1. 数据类型 数组名[数组长度];
  2. 数据类型 数组名[数组长度] = { 值1, 值2 ...};
  3. 数据类型 数组名[] = { 值1, 值2 ...};
#include <iostream>
using namespace std;

int main()
{
	//第1种定义方式:数据类型 数组名[数组长度];
	int arr1[3];
	//赋值:通过下标进行赋值
	arr1[0] = 12;
	arr1[2] = 36;
	//访问元素:通过下标进行访问
	cout << "arr1[0] = " << arr1[0] << endl;
	cout << "arr1[1] = " << arr1[1] << endl;
	cout << "arr1[2] = " << arr1[2] << endl;


	//第2种定义方式:数据类型 数组名[数组长度] = { 值1, 值2 ... };
	//若初始化时没有对所有元素进行赋值,会用对应数据类型的零值填补
	string arr2[5] = {"Tracy","Timo","Felix"};
	//遍历数组
	for (int i = 0; i < 5; i++)
	{
		cout << "arr2[" << i << "] = " << arr2[i] << endl;
	}

	//第3种定义方式:数据类型 数*/组名[] = { 值1, 值2 ... };
	char arr3[] = { 'a', '9', '-', 'e' };
	//统计数个数组在内存中的长度
	cout << "arr3数组整体占用的内存空间大小:" << sizeof(arr3) << endl;
	cout << "arr3数组每个元素占用的内存空间大小:" << sizeof(arr3[0]) << endl;
	cout << "arr3数组长度:" << sizeof(arr3) / sizeof(arr3[0]) << endl;

	//通过数组名查看数组首地址
	cout << "arr3数组首地址:" << (int)arr3 << endl;
	cout << "arr3数组第一个元素的地址:" << (int)&arr3[0] << endl;
	cout << "arr3数组第二个元素的地址:" << (int)&arr3[1] << endl;


	system("pause");

	return 0;
}

输出结果

arr1[0] = 12
arr1[1] = -858993460
arr1[2] = 36
arr2[0] = Tracy
arr2[1] = Timo
arr2[2] = Felix
arr2[3] =
arr2[4] =
arr3数组整体占用的内存空间大小:4
arr3数组每个元素占用的内存空间大小:1
arr3数组长度:4
arr3数组首地址:-1240468028
arr3数组第一个元素的地址:-1240468028
arr3数组第二个元素的地址:-1240468027

Go语言一维数组

三种定义方式

  1. var 数组名 [数组长度]数据类型
  2. var 数组名 = [数组长度]数据类型{值1, 值2 ... }  或  数组名 := [数组长度]数据类型{值1, 值2 ... }
  3. var 数组名 = [...]数据类型{值1, 值2 ... }  或  数组名 := [...]数据类型{值1, 值2 ... }
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	//若初始化时没有对所有元素进行赋值,会用对应数据类型的零值填补
	//第1种定义方式:var 数组名 [数组长度]数据类型
	var arr1 [3]int
	//赋值:通过下标进行赋值
	arr1[0] = 12
	arr1[2] = 36

	//访问元素:通过下标进行访问
	fmt.Println("arr1[0] = ", arr1[0])
	fmt.Println("arr1[1] = ", arr1[1])
	fmt.Println("arr1[2] = ", arr1[2])

	//第2种定义方式:var 数组名 = [数组长度]数据类型{值1, 值2 ... }
	var arr2 = [5]string{"Tracy","Timo","Felix"}
	//遍历数组
	for i:=0; i < len(arr2); i++ {
		fmt.Printf("arr2[%d] = %s\n", i, arr2[i])
	}

	//第3种定义方式:var 数组名 = [...]数据类型{值1, 值2 ... }
	var arr3 = [...]byte{ 'a', '9', '-', 'e' }
	//统计数个数组在内存中的长度
	fmt.Println("arr3数组整体占用的内存空间大小:", unsafe.Sizeof(arr3))
	fmt.Println("arr3数组每个元素占用的内存空间大小:", unsafe.Sizeof(arr3[0]))
	fmt.Println("arr3数组长度:", unsafe.Sizeof(arr3) / unsafe.Sizeof(arr3[0]))

	//通过数组名查看数组首地址
	fmt.Printf("arr3数组首地址:%p\n", &arr3)
	fmt.Printf("arr3数组第一个元素的地址:%p\n", &arr3[0])
	fmt.Printf("arr3数组第二个元素的地址:%p\n", &arr3[1])
}

输出结果

arr1[0] =  12
arr1[1] =  0
arr1[2] =  36
arr2[0] = Tracy
arr2[1] = Timo
arr2[2] = Felix
arr2[3] = 
arr2[4] = 
arr3数组整体占用的内存空间大小: 4
arr3数组每个元素占用的内存空间大小: 1
arr3数组长度: 4
arr3数组首地址:0xc00000a0bc
arr3数组第一个元素的地址:0xc00000a0bc
arr3数组第二个元素的地址:0xc00000a0bd

二维数组

二维数组就是在一维数组上,多加了一个维度,一维数组可以理解为是一行数据,二维数组就是多行数据,像Excel表格一样。

C++ 二维数组

四种定义方式

  1.  数据类型 数组名[行数][列数];
  2.  数据类型 数组名[行数][列数] = { {值1, 值2 ...}, {值3, 值4 ...},...};
  3.  数据类型 数组名[行数][列数] = {值1, 值2 ...};
  4. 数据类型 数组名[][列数] = {值1, 值2 ...};
#include <iostream>
using namespace std;

int main()
{
	//若初始化时没有对所有元素进行赋值,会用对应数据类型的零值填补
	//第1种定义方式:数据类型 数组名[行数][列数];
	int arr1[2][3]; //2行3列的数组

	//赋值:通过下标进行赋值
	arr1[0][0] = 12; //第1行第1列
	arr1[0][1] = 36; //第1行第2列
	arr1[0][2] = 15; //第1行第3列
	arr1[1][0] = 8;  //第2行第1列
	arr1[1][1] = 17; //第2行第2列
	arr1[1][2] = 21; //第2行第3列

	//遍历数组:通过下标进行访问
	for (int i = 0; i < 2; i++)
	{
		cout << "arr1数组 第" << i << "行:[ ";
		for (int j = 0; j < 3; j++)
		{
			cout << arr1[i][j] << " ";
		}
		cout << " ]" << endl;
	}

	// 查看占用内存空间大小
	cout << "arr1二维数组占用空间大小:" << sizeof(arr1) << endl;
	cout << "arr1二维数组第一行占用内存大小:" << sizeof(arr1[0]) << endl;
	cout << "arr1二维数组第一个元素占用内存大小:" << sizeof(arr1[0][0]) << endl;
	cout << "arr1二维数组行数:" << sizeof(arr1) / sizeof(arr1[0]) << endl;
	cout << "arr1二维数组列数:" << sizeof(arr1[0]) / sizeof(arr1[0][0]) << endl;

	//查看二维数组首地址
	cout << "arr1二维数组首地址:" << (int)arr1 << endl;
	cout << "arr1二维数组第一行首地址:" << (int)arr1[0] << endl;
	cout << "arr1二维数组第二行首地址:" << (int)arr1[1] << endl;
	cout << "arr1二维数组第一个元素首地址:" << (int)&arr1[0][0] << endl;
	cout << "arr1二维数组第二个元素首地址:" << (int)&arr1[0][1] << endl;

	
	//第2种定义方式:数据类型 数组名[行数][列数] = { {值1, 值2 ...}, {值3, 值4 ...},... };
	string arr2[2][2] =
	{
		{"Tracy", "Alice"},
		{"Timo", "Felix"}
	};

	for (int i = 0; i < 2; i++)
	{
		cout << "arr2数组 第" << i << "行:[ ";
		for (int j = 0; j < 2; j++)
		{
			cout << arr2[i][j] << " ";
		}
		cout << " ]" << endl;
	}
	
	//第3种定义方式:数据类型 数组名[行数][列数] = { 值1, 值2 ... };
	char arr3[2][2] = {'a', 'b', 'c', 'd'};

	for (int i = 0; i < 2; i++)
	{
		cout << "arr3数组 第" << i << "行:[ ";
		for (int j = 0; j < 2; j++)
		{
			cout << arr3[i][j] << " ";
		}
		cout << " ]" << endl;
	}
	
	//第4种定义方式:数据类型 数组名[][列数] = { 值1, 值2 ... };
	int arr4[][3] = { 1,2,3,4,5,6 };

	for (int i = 0; i < 2; i++)
	{
		cout << "arr4数组 第" << i << "行:[ ";
		for (int j = 0; j < 3; j++)
		{
			cout << arr4[i][j] << " ";
		}
		cout << " ]" << endl;
	}

	system("pause");

	return 0;
}

输出结果

arr1数组 第0行:[ 12 36 15  ]
arr1数组 第1行:[ 8 17 21  ]
arr1二维数组占用空间大小:24
arr1二维数组第一行占用内存大小:12
arr1二维数组第一个元素占用内存大小:4
arr1二维数组行数:2
arr1二维数组列数:3
arr1二维数组首地址:1611659160
arr1二维数组第一行首地址:1611659160
arr1二维数组第二行首地址:1611659172
arr1二维数组第一个元素首地址:1611659160
arr1二维数组第二个元素首地址:1611659164
arr2数组 第0行:[ Tracy Alice  ]
arr2数组 第1行:[ Timo Felix  ]
arr3数组 第0行:[ a b  ]
arr3数组 第1行:[ c d  ]
arr4数组 第0行:[ 1 2 3  ]
arr4数组 第1行:[ 4 5 6  ]

Go语言 二维数组

三种定义方式

  1. var 数组名 [行数][列数]数据类型
  2. 数组名 := [行数][列数]数据类型{ {值1, 值2 ...}, {值3, 值4 ...},... }
  3. 数组名 := [][]数据类型{}
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	//第1种定义方式:var 数组名 [行数][列数]数据类型
	var arr1 [2][3]int

	//赋值:通过下标进行赋值
	arr1[0][0] = 12 //第1行第1列
	arr1[0][1] = 36 //第1行第2列
	arr1[0][2] = 15 //第1行第3列
	arr1[1][0] = 8  //第2行第1列
	arr1[1][1] = 17 //第2行第2列
	arr1[1][2] = 21 //第2行第3列

	//遍历数组
	for i := 0; i < 2; i++ {
		fmt.Printf("arr1数组 第%d行:[ ", i)
		for j := 0; j < 3; j++ {
			fmt.Print(arr1[i][j], " ")
		}
		fmt.Println("]")
	}

	// 查看占用内存空间大小
	fmt.Println("arr1二维数组占用空间大小:", unsafe.Sizeof(arr1))
	fmt.Println("arr1二维数组第一行占用内存大小:", unsafe.Sizeof(arr1[0]))
	fmt.Println("arr1二维数组第一个元素占用内存大小:", unsafe.Sizeof(arr1[0][0]))
	fmt.Println("arr1二维数组行数:", unsafe.Sizeof(arr1) / unsafe.Sizeof(arr1[0]))
	fmt.Println("arr1二维数组列数:", unsafe.Sizeof(arr1[0]) / unsafe.Sizeof(arr1[0][0]))

	//查看二维数组首地址
	fmt.Printf("arr1二维数组首地址:%p\n", &arr1)
	fmt.Printf("arr1二维数组第一行首地址:%p\n", &arr1[0])
	fmt.Printf("arr1二维数组第二行首地址:%p\n", &arr1[1])
	fmt.Printf("arr1二维数组第一个元素首地址:%p\n", &arr1[0][0])
	fmt.Printf("arr1二维数组第二个元素首地址:%p\n", &arr1[0][1])

	//第2种定义方式:数组名 := [行数][列数]数据类型{ {值1, 值2 ...}, {值3, 值4 ...},... }
	arr2 := [2][2]string{{"Tracy", "Alice"},{"Timo", "Felix"}}

	//遍历数组
	for i := range arr2 {
		fmt.Printf("arr2数组 第%d行:", i)
		fmt.Println(arr2[i])
	}

	//第3种定义方式:
	arr3 := [][]string{}

	//d创建3个一维数组,每个数组长度不一样
	row1 := []string{ "Tracy", "Alice" }
	row2 := []string{ "Timo" }
	row3 := []string{ "Daniel", "Felix","Tom" }

	//将一维数组添加至二维数组中
	arr3 = append(arr3, row1)
	arr3 = append(arr3, row2)
	arr3 = append(arr3, row3)

	//遍历数组
	for i := range arr3 {
		fmt.Printf("arr3数组 第%d行:", i)
		fmt.Println(arr3[i])
	}

	// 查看占用内存空间大小
	fmt.Println("arr3二维数组占用空间大小:", unsafe.Sizeof(arr3))
	fmt.Println("arr3二维数组第一行占用内存大小:", unsafe.Sizeof(arr3[0]))
	fmt.Println("arr3二维数组第二行占用内存大小:", unsafe.Sizeof(arr3[1]))
	fmt.Println("arr3二维数组第三行占用内存大小:", unsafe.Sizeof(arr3[2]))
	fmt.Println("arr3二维数组第一个元素占用内存大小:", unsafe.Sizeof(arr3[0][0]))

	//查看二维数组首地址
	fmt.Printf("arr3二维数组首地址:%p\n", &arr3)
	fmt.Printf("arr3二维数组第一行首地址:%p\n", &arr3[0])
	fmt.Printf("arr3二维数组第二行首地址:%p\n", &arr3[1])
	fmt.Printf("arr3二维数组第一个元素首地址:%p\n", &arr3[0][0])
	fmt.Printf("arr3二维数组第二个元素首地址:%p\n", &arr3[0][1])
}

输出结果

arr1二维数组占用空间大小: 48
arr1二维数组第一行占用内存大小: 24
arr1二维数组第一个元素占用内存大小: 8
arr1二维数组行数: 2
arr1二维数组列数: 3
arr1二维数组首地址:0xc00000c2d0
arr1二维数组第一行首地址:0xc00000c2d0
arr1二维数组第二行首地址:0xc00000c2e8
arr1二维数组第一个元素首地址:0xc00000c2d0
arr1二维数组第二个元素首地址:0xc00000c2d8
arr2数组 第0行:[Tracy Alice]
arr2数组 第1行:[Timo Felix]
arr3数组 第0行:[Tracy Alice]
arr3数组 第1行:[Timo]
arr3数组 第2行:[Daniel Felix Tom]
arr3二维数组占用空间大小: 24
arr3二维数组第一行占用内存大小: 24
arr3二维数组第二行占用内存大小: 24
arr3二维数组第三行占用内存大小: 24
arr3二维数组第一个元素占用内存大小: 16
arr3二维数组首地址:0xc0000044e0
arr3二维数组第一行首地址:0xc000044060
arr3二维数组第二行首地址:0xc000044078
arr3二维数组第一个元素首地址:0xc000004500
arr3二维数组第二个元素首地址:0xc000004510

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值