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


    数组

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

    特点:

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

    一维数组

    C++ 一维数组

    三种定义方式

    1. 数据类型 数组名[数组长度];
    2. 数据类型 数组名[数组长度] = { 值1, 值2 ...};
    3. 数据类型 数组名[] = { 值1, 值2 ...};
    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //第1种定义方式:数据类型 数组名[数组长度];
    6. int arr1[3];
    7. //赋值:通过下标进行赋值
    8. arr1[0] = 12;
    9. arr1[2] = 36;
    10. //访问元素:通过下标进行访问
    11. cout << "arr1[0] = " << arr1[0] << endl;
    12. cout << "arr1[1] = " << arr1[1] << endl;
    13. cout << "arr1[2] = " << arr1[2] << endl;
    14. //第2种定义方式:数据类型 数组名[数组长度] = { 值1, 值2 ... };
    15. //若初始化时没有对所有元素进行赋值,会用对应数据类型的零值填补
    16. string arr2[5] = {"Tracy","Timo","Felix"};
    17. //遍历数组
    18. for (int i = 0; i < 5; i++)
    19. {
    20. cout << "arr2[" << i << "] = " << arr2[i] << endl;
    21. }
    22. //第3种定义方式:数据类型 数*/组名[] = { 值1, 值2 ... };
    23. char arr3[] = { 'a', '9', '-', 'e' };
    24. //统计数个数组在内存中的长度
    25. cout << "arr3数组整体占用的内存空间大小:" << sizeof(arr3) << endl;
    26. cout << "arr3数组每个元素占用的内存空间大小:" << sizeof(arr3[0]) << endl;
    27. cout << "arr3数组长度:" << sizeof(arr3) / sizeof(arr3[0]) << endl;
    28. //通过数组名查看数组首地址
    29. cout << "arr3数组首地址:" << (int)arr3 << endl;
    30. cout << "arr3数组第一个元素的地址:" << (int)&arr3[0] << endl;
    31. cout << "arr3数组第二个元素的地址:" << (int)&arr3[1] << endl;
    32. system("pause");
    33. return 0;
    34. }

    输出结果

    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 ... }
    1. package main
    2. import (
    3. "fmt"
    4. "unsafe"
    5. )
    6. func main() {
    7. //若初始化时没有对所有元素进行赋值,会用对应数据类型的零值填补
    8. //第1种定义方式:var 数组名 [数组长度]数据类型
    9. var arr1 [3]int
    10. //赋值:通过下标进行赋值
    11. arr1[0] = 12
    12. arr1[2] = 36
    13. //访问元素:通过下标进行访问
    14. fmt.Println("arr1[0] = ", arr1[0])
    15. fmt.Println("arr1[1] = ", arr1[1])
    16. fmt.Println("arr1[2] = ", arr1[2])
    17. //第2种定义方式:var 数组名 = [数组长度]数据类型{值1, 值2 ... }
    18. var arr2 = [5]string{"Tracy","Timo","Felix"}
    19. //遍历数组
    20. for i:=0; i < len(arr2); i++ {
    21. fmt.Printf("arr2[%d] = %s\n", i, arr2[i])
    22. }
    23. //第3种定义方式:var 数组名 = [...]数据类型{值1, 值2 ... }
    24. var arr3 = [...]byte{ 'a', '9', '-', 'e' }
    25. //统计数个数组在内存中的长度
    26. fmt.Println("arr3数组整体占用的内存空间大小:", unsafe.Sizeof(arr3))
    27. fmt.Println("arr3数组每个元素占用的内存空间大小:", unsafe.Sizeof(arr3[0]))
    28. fmt.Println("arr3数组长度:", unsafe.Sizeof(arr3) / unsafe.Sizeof(arr3[0]))
    29. //通过数组名查看数组首地址
    30. fmt.Printf("arr3数组首地址:%p\n", &arr3)
    31. fmt.Printf("arr3数组第一个元素的地址:%p\n", &arr3[0])
    32. fmt.Printf("arr3数组第二个元素的地址:%p\n", &arr3[1])
    33. }

    输出结果

    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 ...};
    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //若初始化时没有对所有元素进行赋值,会用对应数据类型的零值填补
    6. //第1种定义方式:数据类型 数组名[行数][列数];
    7. int arr1[2][3]; //2行3列的数组
    8. //赋值:通过下标进行赋值
    9. arr1[0][0] = 12; //第1行第1列
    10. arr1[0][1] = 36; //第1行第2列
    11. arr1[0][2] = 15; //第1行第3列
    12. arr1[1][0] = 8; //第2行第1列
    13. arr1[1][1] = 17; //第2行第2列
    14. arr1[1][2] = 21; //第2行第3列
    15. //遍历数组:通过下标进行访问
    16. for (int i = 0; i < 2; i++)
    17. {
    18. cout << "arr1数组 第" << i << "行:[ ";
    19. for (int j = 0; j < 3; j++)
    20. {
    21. cout << arr1[i][j] << " ";
    22. }
    23. cout << " ]" << endl;
    24. }
    25. // 查看占用内存空间大小
    26. cout << "arr1二维数组占用空间大小:" << sizeof(arr1) << endl;
    27. cout << "arr1二维数组第一行占用内存大小:" << sizeof(arr1[0]) << endl;
    28. cout << "arr1二维数组第一个元素占用内存大小:" << sizeof(arr1[0][0]) << endl;
    29. cout << "arr1二维数组行数:" << sizeof(arr1) / sizeof(arr1[0]) << endl;
    30. cout << "arr1二维数组列数:" << sizeof(arr1[0]) / sizeof(arr1[0][0]) << endl;
    31. //查看二维数组首地址
    32. cout << "arr1二维数组首地址:" << (int)arr1 << endl;
    33. cout << "arr1二维数组第一行首地址:" << (int)arr1[0] << endl;
    34. cout << "arr1二维数组第二行首地址:" << (int)arr1[1] << endl;
    35. cout << "arr1二维数组第一个元素首地址:" << (int)&arr1[0][0] << endl;
    36. cout << "arr1二维数组第二个元素首地址:" << (int)&arr1[0][1] << endl;
    37. //第2种定义方式:数据类型 数组名[行数][列数] = { {值1, 值2 ...}, {值3, 值4 ...},... };
    38. string arr2[2][2] =
    39. {
    40. {"Tracy", "Alice"},
    41. {"Timo", "Felix"}
    42. };
    43. for (int i = 0; i < 2; i++)
    44. {
    45. cout << "arr2数组 第" << i << "行:[ ";
    46. for (int j = 0; j < 2; j++)
    47. {
    48. cout << arr2[i][j] << " ";
    49. }
    50. cout << " ]" << endl;
    51. }
    52. //第3种定义方式:数据类型 数组名[行数][列数] = { 值1, 值2 ... };
    53. char arr3[2][2] = {'a', 'b', 'c', 'd'};
    54. for (int i = 0; i < 2; i++)
    55. {
    56. cout << "arr3数组 第" << i << "行:[ ";
    57. for (int j = 0; j < 2; j++)
    58. {
    59. cout << arr3[i][j] << " ";
    60. }
    61. cout << " ]" << endl;
    62. }
    63. //第4种定义方式:数据类型 数组名[][列数] = { 值1, 值2 ... };
    64. int arr4[][3] = { 1,2,3,4,5,6 };
    65. for (int i = 0; i < 2; i++)
    66. {
    67. cout << "arr4数组 第" << i << "行:[ ";
    68. for (int j = 0; j < 3; j++)
    69. {
    70. cout << arr4[i][j] << " ";
    71. }
    72. cout << " ]" << endl;
    73. }
    74. system("pause");
    75. return 0;
    76. }

    输出结果

    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. 数组名 := [][]数据类型{}
    1. package main
    2. import (
    3. "fmt"
    4. "unsafe"
    5. )
    6. func main() {
    7. //第1种定义方式:var 数组名 [行数][列数]数据类型
    8. var arr1 [2][3]int
    9. //赋值:通过下标进行赋值
    10. arr1[0][0] = 12 //第1行第1列
    11. arr1[0][1] = 36 //第1行第2列
    12. arr1[0][2] = 15 //第1行第3列
    13. arr1[1][0] = 8 //第2行第1列
    14. arr1[1][1] = 17 //第2行第2列
    15. arr1[1][2] = 21 //第2行第3列
    16. //遍历数组
    17. for i := 0; i < 2; i++ {
    18. fmt.Printf("arr1数组 第%d行:[ ", i)
    19. for j := 0; j < 3; j++ {
    20. fmt.Print(arr1[i][j], " ")
    21. }
    22. fmt.Println("]")
    23. }
    24. // 查看占用内存空间大小
    25. fmt.Println("arr1二维数组占用空间大小:", unsafe.Sizeof(arr1))
    26. fmt.Println("arr1二维数组第一行占用内存大小:", unsafe.Sizeof(arr1[0]))
    27. fmt.Println("arr1二维数组第一个元素占用内存大小:", unsafe.Sizeof(arr1[0][0]))
    28. fmt.Println("arr1二维数组行数:", unsafe.Sizeof(arr1) / unsafe.Sizeof(arr1[0]))
    29. fmt.Println("arr1二维数组列数:", unsafe.Sizeof(arr1[0]) / unsafe.Sizeof(arr1[0][0]))
    30. //查看二维数组首地址
    31. fmt.Printf("arr1二维数组首地址:%p\n", &arr1)
    32. fmt.Printf("arr1二维数组第一行首地址:%p\n", &arr1[0])
    33. fmt.Printf("arr1二维数组第二行首地址:%p\n", &arr1[1])
    34. fmt.Printf("arr1二维数组第一个元素首地址:%p\n", &arr1[0][0])
    35. fmt.Printf("arr1二维数组第二个元素首地址:%p\n", &arr1[0][1])
    36. //第2种定义方式:数组名 := [行数][列数]数据类型{ {值1, 值2 ...}, {值3, 值4 ...},... }
    37. arr2 := [2][2]string{{"Tracy", "Alice"},{"Timo", "Felix"}}
    38. //遍历数组
    39. for i := range arr2 {
    40. fmt.Printf("arr2数组 第%d行:", i)
    41. fmt.Println(arr2[i])
    42. }
    43. //第3种定义方式:
    44. arr3 := [][]string{}
    45. //d创建3个一维数组,每个数组长度不一样
    46. row1 := []string{ "Tracy", "Alice" }
    47. row2 := []string{ "Timo" }
    48. row3 := []string{ "Daniel", "Felix","Tom" }
    49. //将一维数组添加至二维数组中
    50. arr3 = append(arr3, row1)
    51. arr3 = append(arr3, row2)
    52. arr3 = append(arr3, row3)
    53. //遍历数组
    54. for i := range arr3 {
    55. fmt.Printf("arr3数组 第%d行:", i)
    56. fmt.Println(arr3[i])
    57. }
    58. // 查看占用内存空间大小
    59. fmt.Println("arr3二维数组占用空间大小:", unsafe.Sizeof(arr3))
    60. fmt.Println("arr3二维数组第一行占用内存大小:", unsafe.Sizeof(arr3[0]))
    61. fmt.Println("arr3二维数组第二行占用内存大小:", unsafe.Sizeof(arr3[1]))
    62. fmt.Println("arr3二维数组第三行占用内存大小:", unsafe.Sizeof(arr3[2]))
    63. fmt.Println("arr3二维数组第一个元素占用内存大小:", unsafe.Sizeof(arr3[0][0]))
    64. //查看二维数组首地址
    65. fmt.Printf("arr3二维数组首地址:%p\n", &arr3)
    66. fmt.Printf("arr3二维数组第一行首地址:%p\n", &arr3[0])
    67. fmt.Printf("arr3二维数组第二行首地址:%p\n", &arr3[1])
    68. fmt.Printf("arr3二维数组第一个元素首地址:%p\n", &arr3[0][0])
    69. fmt.Printf("arr3二维数组第二个元素首地址:%p\n", &arr3[0][1])
    70. }

    输出结果

    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

  • 相关阅读:
    s20.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(二)
    Go 语言学习总结(9)—— Go 与 Java 全面对比总结
    iOS 硬件解码相关
    【算法练习Day48】回文子串&&最长回文子序列
    【mia】rtcdn-draft 基于http的rtc订阅及mia实现
    Var let const 重复声明问题,以及三种区别
    [Qt基础内容-09] Qt中MVC的C(Delegate)
    论文解读( N2N)《Node Representation Learning in Graph via Node-to-Neighbourhood Mutual Information Maximization》
    gradle升级,plugin使用方法
    新版软考高项试题分析精选(一)
  • 原文地址:https://blog.csdn.net/ling1998/article/details/125884351