数据结构-数组

1、数组

概念

构造数据类型之一
数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。
数组中各元素的数据类型要求相同,用数组名和下标确定。数组可以是一维的,也可以多维
数组就是一组相同类型的数据
在这里插入图片描述数组就是用一段连续的空间存储相同类型的变量

数组的定义

//定义数组前 必须明确 有几个元素      每个元素类型啥?
//需求:定义一个数组 有10个元素  每个元素为int类型

//数组定义步骤:
//1、数组名 与[]结合是数组           (与*结合是指针  与()是函数)
//2、将元素的个数 放入[]中
//3、用元素的类型 定义一个变量
//4、从上往下 整体替换
int arr[10];

数组元素的描述

void test01()
{
    //有10个元素 元素的下标从0开始 0~9
    //arr[0] 第0个元素 ~arr[9]第9个元素
    int arr[10];
    //arr数组名作为类型 代表的是数组的总大小 = 元素的个数 * 每个元素的大小
    printf("sizeof(arr) = %d\n",sizeof(arr));//数组的总大小
    printf("sizeof(arr[0]) = %d\n",sizeof(arr[0]));//第0个元素的大小
    //数组的个数 = 数组的总大小 / 元素的大小
    int n = sizeof(arr)/sizeof(arr[0]);//元素的个数

    //数值数组 不能整体操作 只能逐个元素操作
    for (int i = 0; i < n; i++)
    {
    //{}里面定义的数组为局部数组 不初始化 内容为随机
        printf("第%d个元素为%d\n", i, arr[i]);
    }
}

数组的初始化

void test02()
{
    //全部初始化 元素的个数可以省略
    // int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    //如果数组的元素个数省略 元素实际个数 由初始化决定
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int n = sizeof(arr)/sizeof(arr[0]);

    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    //部分初始化 未被初始化的部分自动补0
    int arr2[10] = {1,2,3,4,5};
    n = sizeof(arr2)/sizeof(arr2[0]);
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr2[i]);
    }
    printf("\n");

    //部分初始化的妙用(清空数组)
    int arr3[10] = {0};//将第0个元素初始化为0 其他自动补0 所以全部为0
    n = sizeof(arr3)/sizeof(arr3[0]);
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr3[i]);
    }
    printf("\n");

    //指定下表初始化
    int arr4[10] = {[1]=10, [3]=30, [5]=50};//了解
    n = sizeof(arr4)/sizeof(arr4[0]);
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr4[i]);
    }
    printf("\n");
}

2、二维数组

定义方式

数据类型 数组名[行数][列数]; 例子: int a[3][4]; 创建了一个三行四列的二维数组 二维数组还是连续存储的
取数据:a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2]
a[1][3] …
在这里插入图片描述在这里插入图片描述

二维数组的初始化

二维数组的初始化
void test03()
{
//分段初始化
    int arr[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
    int row = sizeof(arr)/sizeof(arr[0]);
    int col = sizeof(arr[0])/sizeof(arr[0][0]);
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d ", arr[i][j]);
        }
            printf("\n");
    }

//连续初始化
    int arr2[3][4]={1,2,3,4,5,6,7,8,9,10,11,12 };
    row = sizeof(arr2)/sizeof(arr2[0]);
    col = sizeof(arr2[0])/sizeof(arr2[0][0]);
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
    {
        printf("%d ", arr2[i][j]);
    }
        printf("\n");
    }

//综合案例:
    int arr3[3][4] = {{1,2},{3},{4,5}};
    int arr4[3][4] = {1,2,3,4,5};

    printf("%d\n",arr3[1][2]+arr4[1][2]);
}

3、字符数组

字符数组是元素的数据类型为字符类型的数组, 它既具有普通数组的一般性质,又具有某些特殊性质。 字符数组的初始化 逐个字符赋值
用字符串常量

void test04()
{
//需求:定义一个数组 32个元素 每个元素为char 这就是字符数组
//arr作为类型 代表的是数组的总大小
//数组名作为地址 代表的是 数组的首元素地址
    char arr[32] = "";

//获取键盘输入 %s和scanf结合时候 遇到空格 回车 结束输入
    printf("请输入一个字符串:");
    scanf("%s", arr);

    printf("arr=%s\n",arr);

//如果想获取带空格的字符串fgets
//fgets(存放的位置, 获取字符长度的上限, 从哪儿获取字符串);
    char str[32]="";
    fgets(str, sizeof(str), stdin);//stdin标准输入设备(键盘)

    printf("str = ##%s##\n", str);

}

4、字符串函数

1 -- strlen
	#include <string.h>
	size_t strlen(const char *s);
	功能:计算一个字符串的长度
	参数:
		s:保存字符串的首地址,一般为保存字符串的数组的首地址
	返回值:
		字符串的长度
	注意:使用strlen获取字符串的长度,不包括\0
		
2 -- strcpy
	#include <string.h>
	char *strcpy(char *dest, const char *src);
	功能:将src字符串复制到dest里面
	参数:
		dest:目的字符串
		src:原字符串
	返回值:
		同dest
	注意:将src的第一个\0也会复制给dest
		  必须保证strcpy的第一个参数对应的空间足够大,否则会内存溢出
			  
3 -- strcat
	#include <string.h>
	char *strcat(char *dest, const char *src);
	功能:将src追加到dest的后面
	参数:
		dest:目的字符串
		src:原字符串
	返回值:
		同dest
			
	注意:
		strcat将src的数据(包括\0)追加到dest的后面,从dest'\0'的位置开始
		注意:必须保证dest足够大,否则内存溢出 
	
4 -- strcmp
	#include <string.h>
	int strcmp(const char *s1, const char *s2);
	功能:比较两个字符串的内容是否一样
	参数:
		s1,s2:两个字符串
	返回值:
		=0 s1 = s2
		>0 s1 > s2
		<0 s1 < s2
	注意:strcmp比较两个字符串,是一个字符一个字符比较,如果出现不一样的,
		 立即返回,根据对应ascii决定大小            
		 比较到\0的时候就停止

	int strncmp(const char *s1, const char *s2, size_t n);
	功能:比较两个字符串的前n个字节是否一样
在C++中,如果你想要用数组模拟顺序表(类似于数组但更灵活),你可以直接使用数组a存储数据,但是数组的大小一旦初始化,就无法动态改变。所以对于插入和删除这样的操作数组并不是最佳选择。如果你只是想说明如何处理数组中的数据,那么可以这样做: 1. **遍历数组:**对数组中的每个元素进行操作,例如打印、访问等: ```cpp for (int i = 0; i < 10; i++) { cout << "a[" << i << "] = " << a[i] << endl; } ``` 2. **插入操作:**由于数组不允许动态插入,如果需要插入新元素,你可能需要复制整个数组并增大尺寸,这不是一个好的实践。但如果是在特定情况下,如数组头部插入,可以用这种方法: ```cpp // 在开始插入元素 void insertAtStart(int value) { int* newArray = new int[10 + 1]; // 创建新的数组 newArray[0] = value; memcpy(newArray + 1, a, sizeof(a)); // 复制原数组到新数组 delete[] a; // 释放旧数组内存 a = newArray; // 更新指针 } ``` 3. **删除操作:**同样,数组中删除元素比较复杂,特别是中间位置的删除。如果真的要删除,你可能需要从后面向前移动元素,这会涉及大量的数据移动。不过常规情况下,我们更倾向于使用其他数据结构,如vector或list。 4. **计算长度:**数组的实际长度可以直接通过下标得到,例如: ```cpp int arrayLength = 10; // 固定大小的数组,所以长度始终为10 ``` 5. **查找元素位置:**查找元素可以在循环里逐个比较,找到后返回索引,找不到返回-1: ```cpp int findIndex(int target) { for (int i = 0; i < 10; i++) { if (a[i] == target) { return i; } } return -1; } ``` **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值