目录
1、一维数组
1、数组的创建
2、数组的初始化
3、一维数组的使用
4、一维数组在内存中的存储
2、二维数组
1、二维数组的创建
2、二维数组的初始化
3、二维数组的使用
4、二维数组在内存中的存储
3、数组越界
4、数组作为函数参数
1、冒泡排序:
5、练习
1、逆序一个字符串内容
2、逆序一个字符串内容(递归实现)
1、一维数组
1、数组的创建
数组是一组相同类型元素的集合。
1、数组的创建方式:
2、数组创建的实例:
注意:C99中引入了变长数组的概念,变长数组支持:数组创建时,数组的大小可以使用变量来指定,但是不能初始化。vs2019不支持C99的变长数组,但是一些OJ平台支持,可以拿来刷题。
2、数组的初始化
数组的初始化是指:在创建数组的同时,给数组的内容一些合理初始值。
数组在创建的时候如果想不指定数组的确定的大小就得初始化,数组的元素个数根据初始化的内容来确定。
注意:
3、一维数组的使用
1、数组是使用下标来访问的,下标是从0开始。
2、数组的大小可以通过计算得到。
4、一维数组在内存中的存储
1、数组在内存中是连续存放的
2、随着数组下标的增长,地址也是由低到高变化的
注意:
1、%p 是打印地址(十六进制)
2、0——数字0;' \0 '——字符,ASCII码值的是0;' 0 '——字符0,ASCII码值的是48。
2、二维数组
1、二维数组的创建
2、二维数组的初始化
3、二维数组的使用
二维数组的使用也是通过下标的方式
例如:int arr[3][4]={1,2,3,4,5};
#include<stdio.h>
int main()
{
//二维数组的遍历
int arr[3][4] = { 1,2,3,4,5 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
4、二维数组在内存中的存储
二维数组在内存中也是连续存储的。
3、数组越界
数组的下标是有范围限制的。数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,所以写代码时,最好自己做越界的检查。
4、数组作为函数参数
数组在传参时会退化,传过去的是数组首元素地址,如果要访问整个数组,可以再传一个数组元素个数。
注意:数组名是首元素地址。但是存在两个例外:1、sizeof(数组名),此时数组名表示整个数组,计算的是整个数组的大小,单位:字节。 2、&数组名,取出的是整个数组的地址。
1、冒泡排序:
冒泡排序的核心思想:两两相邻的元素进行比较。
void bubble_sort(int arr[], int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
swap(&arr[j], &arr[j + 1]);
}
}
}
}
5、练习
1、逆序一个字符串内容
注意:strlen是库函数,求字符串的长度;sizeof是操作符,计算数据所占内存空间的大小,单位是字节。
void reverse_string(char* str)
{
int len = strlen(str);
char* left = str;
char* right = str + len - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
2、逆序一个字符串内容(递归实现)
void reverse_string(char* str)
{
int len = strlen(str);
char tmp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if (strlen(str + 1) > 1)
reverse_string(str + 1);
*(str + len - 1) = tmp;
}
注意:long long打印为 %lld