数组【零基础搞定C语言——7】






1.除了形参使用数组或者指针,通过全局变量也能做到把函数处理结果的二个数据返回给主调函数。

解析:

全局变量在函数当中被改变,自然主调函数内他的值也变了,但不建议这样使用!

//1.数组
void test(int arr[])
{
	arr[0] = 1;
	arr[1] = 2;
}


int main()
{
	int arr[10] = { 0 };
	test(arr);

	return 0;
}


//2.指针
void test(int*p1, int *p2)
{
	*p1 = 1;
	*p2 = 2;
}


int main()
{
	int a = 0;
	int b = 0;
	test(&a, &b);

	return 0;
}

//3.全局变量

int a;
int b;

void test()
{
	a = 1;
	b = 2;
}


int a = 0;
int b = 0;

int main()
{
	test();
	
	return 0;
}



2.声明数组时不能用常变量,引用数组的时候大胆用常变量。

数组定义声明时不建议用常变量,编译器会报错;引用数组时大胆用常变量

//X定义声明时不建议用常变量,会报错
int n=1;
int arr[n]={0};

//√引用时大胆用常变量
for (i = 0; i < sz; i++)
{
		printf("%d ", arr[i]);
	}



3.数组初始化的几组实例:

int型数组自动补充0;char型数组自动补充\0

//一样的效果
	int arr2[] = { 1,2,3,4,5 };
	int arr2[5] = { 1,2,3,4,5 };

//ch1是bit00,ch2是bit
    char ch1[5] = {'b', 'i', 't'};
	char ch2[] = { 'b', 'i', 't' };

//ch3是b i t \0 0,ch4是b i t \0
    char ch3[5] = "bit";
	char ch4[] = "bit";

//ch5是b i t \0,ch6是b i t,前者字符串长度4,后者长度3
    char ch5[] = "bit";//这里会补\0
	char ch6[] = { 'b', 'i', 't' };





4.数组是相同类型的一段连续的空间,下标是从0开始的。

比如:int array[N],下标的范围为[0,N),其中N位置不能存储有效元素。

具体实例:定义了一维 int 型数组 a[10] 后,引用a[10] = 2会越界。




5.区分strlen与sizeof,看看下面代码具体结果:

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

解析:str字符数组使用"hello bit"初始化,最终也会将’\0’放置到数组中,因此数组中总共有10个元素。

​ sizeof(str):获取数组的总大小,10个元素,每个元素占1个字节,因此总共是10个字节。

​ strlen(str): 获取字符串中有效字符的个数,不算’\0’,因此总共9个有效字符。

​ 故上述printf会分别打印:10 9




6.对于二维数组int array[M][N], 说明如下:

1.M和N都必须为常数,

2.M代表数组有M行,N代表每行中有N个元素

3.其中M可以省略,省略后必须给出初始化表达式,编译器从初始化结果中推断数组有多少行

4.N一定不能省略,因为N省略了就不能确定一行有多少个元素,也不能确定数组有多少行

在这里插入图片描述




7.二维数组在内存中是连续存储的

int arr[][4] = { {1,2}, {3,4} ,{4,5} };
	int i = 0;
	int j = 0;
	int* p = &arr[0][0];

	for (i = 0; i < 12; i++)//按顺序输出数组内12个元素
	{
		printf("%d ", *p);
		p++;
	}

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}

在这里插入图片描述

可以观察到俩个for循环的结果,第一个for循环先逐列输出,再换行继续;第二个for循环结果可知每个元素地址差为4.




8.冒泡排序

flag是为了尽可能减少计算,不加flag计算量可能会大些。

void bubble_sort(int arr[], int sz)//形参arr本质是指针
{
	//确定趟数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的过程
		int j = 0;
		int flag = 1;

		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				//交换
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}
int main()
{
	//int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };

	//排序为升序 - 冒泡排序
	//计算数组元素个数
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);//数组传参的时候,传递的其实是数组首元素的地址
	return 0;
}



9.数组名是什么?

数组名是数组首元素的地址,但是有2个例外 :

  1. sizeof(数组名) - 数组名表示整个数组 - 计算的是整个数组的大小,单位是字节
  2. &数组名 - 数组名表示整个数组 - 取出的是整个数组的地址
int arr[10] = { 0 };
	printf("%p\n", &arr);//&arr取出的是整个数组的地址
	printf("%p\n", &arr+1);//可以看到地址加了40,加了整个数组的地址,


	printf("%p\n", arr);//取出的是数组的首地址
	printf("%p\n", arr+1);//可以看到地址加了4,加了数组一个元素的地址大小。

在这里插入图片描述

	int sz = sizeof(arr);//数组名表示整个数组
  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林慢慢脑瓜子嗡嗡的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值