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

文章目录

      • 1.除了形参使用数组或者指针,通过全局变量也能做到把函数处理结果的二个数据返回给主调函数。
      • 2.声明数组时不能用常变量,引用数组的时候大胆用常变量。
      • 3.数组初始化的几组实例:
      • 4.数组是相同类型的一段连续的空间,下标是从0开始的。
      • 5.区分strlen与sizeof,看看下面代码具体结果:
      • 6.对于二维数组int array[M][N], 说明如下:
      • 7.二维数组在内存中是连续存储的
      • 8.冒泡排序
      • 9.数组名是什么?





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 
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省略了就不能确定一行有多少个元素,也不能确定数组有多少行

【零基础搞定C语言——7】_第1张图片




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]);
		}

【零基础搞定C语言——7】_第2张图片

可以观察到俩个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,加了数组一个元素的地址大小。

【零基础搞定C语言——7】_第3张图片

	int sz = sizeof(arr);//数组名表示整个数组

你可能感兴趣的:(c语言)