3.C语言数组

1.一维数组

1.1一维数组的创建

一维数组的创建有三部分

1.数据类型    2.数组名   3.常量或常量表达式

//C99 之前数组只能是常量指定大小

//C99 之后引用了变长数组的概念,数组的大小是可以使用变量指定的

//但是VS2022、2019 不支持C99的边长数组的

1.2一维数组的初始化

数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。

1.3一维数组的使用

数组是通过下标来访问的

数组大大小可以通过sizeof来计算

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	//数组元素的初始化
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	//按顺序输出数组元素
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	//倒序输出数组元素
	for (i = 9; i >= 0; i--)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

1.4一维数组在内存中的存储

仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。

由此可以得出结论:

1.数组在内存中是连续存放的。

2.随着下标增长,地址由低到高变化

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("&arr[%d]=%p\n", i, &arr[i]);
		//%p输出地址
	}
}

1.5    sizeof 和strlen的比较

sizeof是操作符                                                     strlen是库函数,需要头文件<string,h>

计算对象是任意类型(int·····)                            计算对象是字符串

计算的是占用内存的大小,单位是字节                  计算的是\0之前出现的字符个数\,0不计算在内

sizeof在计算字符串时会把\0 也计算在内

#include<string.h>
int main()
{
	char arr1[] = { "abc" };
	char arr2[] = { 'a','b','c' };
	printf("%d\n", strlen(arr1));
	//这里数组内是字符串,后面自动有\0,所以数组元素个数是3个
	printf("%d\n", strlen(arr2));
	//注意这里求数组长度的时候因为数组初始化没有\0,所以strlen长度随机,所以strlen只针对字符串
	return 0;
}

#include<string.h>
int main()
{
	char arr[] = { "abcdefg" };
	printf("%d\n", strlen(arr));
	printf("%d\n", sizeof(arr));
	return 0;
}

2.二维数组

2.1二维数组的创建和初始化

二维数组有两个下标,第一个表示行,第二个表示列

2.2二维数组的使用

int main()
{
	int i = 0, j = 0;
	int arr[3][5] = { {1,2,5,}, {2,4,6,7}, {1,6,7,9,8} };
	//改变数组元素为1到15
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			arr[i][j] = i * 5 + j + 1;
		}
	}
	//打印二维数组
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

2.3二维数组在内存中的存储

由此可知二维数组在内存中的存储也是连续的

int main()
{
    int arr[3][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15} };
    int i = 0, j = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            printf("arr[%d][%d]=%p\n", i, j, &arr[i][j]);
        }
    }
    return 0;
}

3.数组做函数参数

3.1数组名是什么

​
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	//数组名
	printf("%p\n", arr);
	printf("%p\n", arr + 1);
	//&数组的首个元素
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0] + 1);
	//&数组名
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);
}

关于冒泡排序

冒泡排序的思想就是把相邻两个元素进行比较,把大的元素放在后面

代码实现

int main()
{
	int arr[] = {10,9,8,7,6,5,4,3,2,1};
	int sz = sizeof(arr)/sizeof(arr[0]);//计算数组元素个数
	int i = 0, j = 0;
	for (i = 0; i < sz - 1; i++)//sz-1表示的是最大趟数
	{
		for (j = 0; j < sz - 1 - i; j++)//sz-1-i表示第i+1趟要交换的最大次数
		{
			if (arr[j] > arr[j + 1])//用if语句判断是否交换
			{
				int t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

3.2冒泡排序的函数实现即数组传参

通过前面接收了数组名是什么就可以更好地理解数组的传参

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。

所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。

错误做法

正确做法

void fun(int arr[],int sz)
{
	
	printf("数组元素个数是%d\n", sz);
	int i = 0, j = 0;
	for (i = 0; i < sz - 1; i++)//sz-1表示的是最大趟数
	{
		for (j = 0; j < sz - 1 - i; j++)//sz-1-i表示第i+1趟要交换的最大次数
		{
			if (arr[j] > arr[j + 1])//用if语句判断是否交换
			{
				int t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
	fun(arr,sz);//数组传参,数组名只传递数组首元素的地址
	return 0;
}

练习:将数组A中的内容和数组B中的内容进行交换。(数组一样大)

void exchange(int* arr1, int* arr2, int len)
{
	int i = 0;
	int ex = 0;
	for (i = 0; i < len; i++)
	{
		ex = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = ex;
	}
	for (i = 0; i < len; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	for (i = 0; i < len; i++)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n");
}

int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 6,7,8,9,10 };
	int len = sizeof(arr1) / sizeof(arr1[0]);
	exchange(arr1, arr2, len);
	return 0;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现上述要求的代码: ```c #include <stdio.h> #include <string.h> int main() { char a[] = "MPSS.DE.3.1.1-00281.4-NETRANI_GENALL_PACK-1.30283.15"; char b[46]; int len; // 拷贝数组a的值到数组b中,并删除-NETRANI_GENALL_PACK部分 char* pos1 = strstr(a, "-NETRANI_GENALL_PACK"); if (pos1 != NULL) { char* pos2 = pos1 + strlen("-NETRANI_GENALL_PACK"); strcpy(b, a); memmove(pos1, pos2, strlen(pos2) + 1); } else { strcpy(b, a); } // 判断数组b的长度是否超过45个字节 len = strlen(b); if (len > 45) { b[45] = '\0'; } printf("数组a:%s\n", a); printf("数组b:%s,长度:%d\n", b, strlen(b)); return 0; } ``` 输出结果为: ``` 数组a:MPSS.DE.3.1.1-00281.4-NETRANI_GENALL_PACK-1.30283.15 数组b:MPSS.DE.3.1.1-00281.4,长度:17 ``` 解释一下代码的实现过程: 1. 首先定义了一个字符数组 `a` 并赋值为给定的字符串。 2. 定义一个字符数组 `b`,长度为46(因为后面会添加一个字符串结束符 `\0`)。 3. 使用 `strstr` 函数查找数组 `a` 中是否包含 `-NETRANI_GENALL_PACK` 子串,如果有,则使用 `memmove` 函数将该子串后面的部分覆盖到该子串的位置上,实现删除该子串的效果;否则直接将数组 `a` 的值拷贝到数组 `b` 中。 4. 使用 `strlen` 函数获取数组 `b` 的长度,如果超过45个字节,则将第46个字符设为字符串结束符 `\0`。 5. 输出数组 `a` 和数组 `b` 的值以及数组 `b` 的长度。 需要注意的是,这里使用了 `strstr` 函数、`memmove` 函数和 `strlen` 函数,需要引入头文件 `string.h`。同时,为了便于输出结果,使用了 `printf` 函数,需要引入头文件 `stdio.h`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值