欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 数组的学习

数组的学习

2024/10/27 23:55:41 来源:https://blog.csdn.net/NJL12138/article/details/141901948  浏览:    关键词:数组的学习

1.一维数组

在C语言中,数组的声明格式为:类型名 数组名[数组长度];例如:int numbers[5]; 表示声明了一个包含5个整数的数组。

数组的元素可以通过索引来访问,索引从0开始计数。例如,要访问数组numbers中的第一个元素,可以使用numbers[0]。

一维数组的初始化主要需要注意字符数组的初始化,如下:

#include<stdio.h>
int main()
{char ch1[4] = { 'a','b','c' };char ch2[4] = "abc";char ch3[] = { 'a','b','c' };char ch4[] = "abc";return 0;
}

这里定义了4个字符型数组,打开监视功能可获取这些数组的初始化内容,如下所示:

观察数组ch1和ch2初始化内容一致,但数组ch3和ch4存放的内容不同,这是因为字符串是以字符“\0”为结束字符存放的,这里初始化时需要注意。

数组可以进行遍历操作,通过循环结构来依次访问数组的每个元素。例如,可以使用for循环来遍历数组中的所有元素。如下所示:

#include<stdio.h>
int main()
{int arr[] = { 0,1,3,4,6,9,5,7 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);printf("&arr[%d]=%p\n", i, &arr[i]);}return 0;
}

运行结果如下:

2.二维数组

C语言中的二维数组是一种特殊的数组,它可以存储多行多列的元素。二维数组可以理解为一个表格,其中每个元素都有行索引和列索引。

在C语言中,二维数组的声明格式为:类型名 数组名[行数][列数];例如:int matrix[3][4]; 表示声明了一个包含3行4列的整数二维数组。

二维数组的元素可以通过两个索引来访问,第一个索引代表行索引,第二个索引代表列索引。例如,要访问二维数组matrix中的第一行第二列的元素,可以使用matrix[0][1]。

二维数组的元素可以通过赋值来初始化,或者在声明时指定初始值。例如,int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; 表示声明了一个3行4列的整数二维数组,并将其初始化为指定的值。

二维数组可以进行遍历操作,通过嵌套循环来遍历数组的每个元素。外层循环用于遍历行,内层循环用于遍历列。例如,可以使用两个嵌套的for循环来遍历二维数组中的所有元素。如下所示:

#include<stdio.h>
int main()
{int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int i = 0;for (i = 0;i < 3;i++){int j = 0;for (j = 0;j < 4;j++){printf("%-2d ", arr[i][j]);//%-2d表示左对齐}printf("\n");}return 0;
}

 运行结果如下:

输出二维数组中每个元素的地址,如下:

从上面可以看出,C语言中的二维数组实际上是一维数组的数组,即每个元素都是一个一维数组。因此,二维数组在内存中是连续存储的,与一维数组存储方式一致,每个一维数组的长度可以不同。

需要注意的是,C语言中的二维数组不会进行边界检查,因此在使用二维数组时要注意避免越界访问。

3.数组传参

在C语言中,数组可以通过传参的方式传递给函数。数组传参是通过将数组名作为参数传递给函数来实现的。

在函数声明中,可以使用以下两种方式来声明接受数组参数的函数:

  1. 数组形式:void func(int arr[]); 在此声明中,数组 arr [ ]可以不指定数组的大小。实际上,在函数内部引用 arr 时,C编译器会自动将其转换为指向整数的指针。

  2. 使用指针:void func(int *arr)在这种声明中,数组 arr 被声明为指向整数的指针。在函数内部引用 arr 时,也需要使用指针操作来访问数组元素。

总之,数组传参,传递的是数组首元素的地址,而不是整个数组,搞不清楚这一点就有可能会出错

下面用一个简单的例子说明数组传参的形式。

对一个数组中元素进行升序处理,先看一个错误代码,如下:

 

#include<stdio.h>void bubble_sort(int arr[])//也可以写成  bubble_sort(int *arr)
{int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0;i < sz-1;i++){int j = 0;for (j = 0;j <sz-1-i ;j++){int tem = 0;if (arr[j] > arr[j + 1]){tem = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tem;}}}
}int main()
{int arr[] = { 1,5,6,44,0,2,21,7,36,9 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}

上面的代码运行没有报错,但运行结果错误,如下所示:

进入调试功能,

我们发现在函数bubble_sort中sz的值不正确,他应该等于数组的元素的个数,这里数组的元素个数显然是大于2,所以代码运行结果不正确。

 这里错误的原因在于,数组传参传递的是数组首元素的地址,即使写成bubble_sort(int arr[])也是传递数组地址,与bubble_sort(int *arr)写法等价。

正确代码如下:

#include<stdio.h>void bubble_sort(int arr[], int sz)
{int i = 0;for (i = 0;i < sz-1;i++){int j = 0;for (j = 0;j <sz-1-i ;j++){int tem = 0;if (arr[j] > arr[j + 1]){tem = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tem;}}}
}int main()
{int arr[] = { 1,5,6,44,0,2,21,7,36,9 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);int i = 0;for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}

 运行结果如下:

在函数内部,可以像使用普通数组一样操作传递的数组。通过使用下标来访问数组元素,或者使用指针操作来访问数组元素。对传递的数组进行修改会影响到原始数组。

需要注意的是,C语言中的数组传参是通过传递数组的地址(指针)来实现的。因此,在函数内部对数组的修改会影响到原始数组。如果不想修改原始数组,可以在函数内部创建一个新的数组来操作。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com