一.数组的正确创建方式及错误示范

  正确的写法

#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3 };//创建一个数组—存放整型-10个,不完全初始化,剩下的元素默认是0
char arr2[5] = { 'a',98 };//字符整形,a,98对应ASCLL码表的b
printf("%s", arr2);//%s打印字符
char arr3[5] = "ab";
char arr4[] = "abcdef";//不给出内存大小,让它自行申请刚好的内存
return 0;
}

  错误写法

int main()
{
int n = 5;
char ch[n];//表达式必须是常量,n是变量所以这样的写法是错误的
}

二.strlen和sizeof的区别


strlen--是求字符串长度的--只能针对字符串求长度--库函数--使用得引用头文件

sizeof--计算变量、数组、类型的大小--单位是字节--操作符--无需头文件

总结

1.数组是使用下标来访问的,下标是从0开始。如arr[0],arr[1]...

2.数组的大小可以通过计算得到。

            int sz = sizeof(arr) / sizeof(arr[0]);

三.一维数组在内存中的储存(数组在内存中是连续存放的)

c语言(数组的基本知识)_c语言基础

四.二维数组的创建及初始化

int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
char ch[5][6];
int arr2[][4] = { {1,2,3,4},{5,6,7,8} };//行可以省略,列不可以省略
}

五.二维数组的打印

int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
//1 2 3 0
//4 5 0 0
//0 0 0 0
int i = 0;
for (i = 0;i < 3;i++)
{
int j = 0;
for (j = 0;j < 4;j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}

六.二维数组的内存中的储存(也是连续储存)

int main()
{
int arr[3][4] = { {1,2,3},{4,5} };
//1 2 3 0
//4 5 0 0
//0 0 0 0
int i = 0;
for (i = 0;i < 3;i++)
{
int j = 0;
for (j = 0;j < 4;j++)
{
printf("&arr[%d][%d]=%p\n ",i,j, &arr[i][j]);
}
printf("\n");
}
return 0;
}

c语言(数组的基本知识)_c语言基础_02

c语言(数组的基本知识)_c语言基础_03

七.冒泡排序

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++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//对arr进行排序,排成升序
//arr是数组,我们对数组arr进行传参,实际上传过去的是数组arr首元素的地址 &arr[0]
bubble_sort(arr, sz);//冒泡排序函数
for (i = 0;i < sz;i++)
{
printf("%d", arr[i]);
}
return 0;
}

优化一下,有序时即某次不再交换,即已经排序完成,可以跳出循环。


void bubble_sort(int arr[], int sz)
{
//确定冒泡排序的趟数
int i = 0;
for (i = 0;i < sz - 1;i++)
{
int flag = 1;//假设这一趟要排序的数据已经有序
//每一趟冒泡排序
int j = 0;
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 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//对arr进行排序,排成升序
//arr是数组,我们对数组arr进行传参,实际上传过去的是数组arr首元素的地址 &arr[0]
bubble_sort(arr, sz);//冒泡排序函数
for (i = 0;i < sz;i++)
{
printf("%d", arr[i]);
}
return 0;
}

八.数组名(是首元素的地址【有两个例外】)

c语言(数组的基本知识)_c语言基础_04

c语言(数组的基本知识)_c语言基础_05

&是取出整个arr数组的地址所以最后两个输出才会相差20

(5个元素,一个元素4个字节,16进制)


例外


//1.sizeof(数组名)——数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节

//2. &数组名,数组名代表整个数组,&数组名,取出的是整个数组的地址​

除这两种情况之外,所有数组名都表示数组首元素的地址。​