目录
一维数组
一维数组的创建和初始化
int main()
{
int n = 3;
//定义表达式:数组类型 数组名 [数组大小(这必须是一个常量表达式)]
int arr[n];//其中n不是常量,语法错误
int arr[3];//正确的格式
int a = 5;//初始化变量a
int arr1[6] = { 1,2,3,4 };//不完全初始化,数组元素为1,2,3,4,\0,\0(注:没有初始化的数组赋值为\0)
int arr2[10] = {1,2,3,4,5,6,7,8,9,10};//完全初始化
int arr3[] = {1,2,3,4,5};//数组根据初始化内容,确定数组的大小
char ch[] = {'a','b','c'};//字符数组初始化
char ch[] = { "abc"};//字符数组存放字符串,这个数组中的元素是a,b,c,\0(注:\0是字符串结束标志)
return;
}
字符初始化需要注意的情况:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char arr[3] = {'a','b','c'};
char arr1[] = "abc";
//输出数组字符串,只有取到\0时才会停止
printf("%s\n",arr);//只能确定这个语句输出的前三个字符为abc,但是不会停止直到这个函数在内存中找到下一个\0才会停止
printf("%s\n", arr1);//这个数组中是abc\0所以只会输出abc
printf("%d\n",strlen(arr));//strlen()函数是求数组长度的函数
//数组的长度还可以用sizeof(arr)/sizeof(arr[0]);//数组总长度/单个数组的长度
printf("%d\n", strlen(arr1));
return;
}
一维数组的访问
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = {0};
int i;
for (i = 0;i < 10; i++)
{
arr[i] = i + 1;//数组是从arr[0]开始的,这个数组是arr[0]到arr[9]十个数组的定义
}
for (i=0;i<10;i++)
{
printf("%d\t",arr[i]);//数组的访问
}
return;
}
一维数组在内存中的存储
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//%p -是按照地址的格式打印 -十六进制打印地址
//%x -是十六进制打印
int main()
{
printf("%x\n",0x12);
printf("%p\n", 0x12);
int arr[10] = {0};
int i;
for (i = 0;i < 10; i++)
{
arr[i] = i + 1;//数组是从arr[0]开始的,这个数组是arr[0]到arr[9]十个数组的定义
}
for (i=0;i<10;i++)
{
printf("arr[%d]=%p\n", i,&arr[i]);//数组的访问
}
return;
}
运行结果:因为数组定义的是整形,所以每个数组占四个字节
二维数组
二维数组的创建,初始化和访问
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[3][4] = { {1,1,1,1},{2,2,2,2},{3,3,3,3} };//表示三行四列
for (int i=0;i<3;i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d\t",arr[i][j]);
}
printf("\n");
}
return;
}
通过监测和运行结果来查看数组中的结构
其他初始化方式:用于理解二维数组的内部结构(注:请结合初始化语句和旁边的监控界面查看)
二维数组在内存中的存储
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[3][4] = { {1,1,1,1} ,{2,2,2,2} ,{3,3,3,3} };//表示三行四列
for (int i=0;i<3;i++)
{
for (int j = 0; j < 4; j++)
{
printf("arr[%d][%d]=%p\t",i,j,&arr[i][j]);
}
printf("\n");
}
return;
}
运行结果
注:可以相邻的数组之间差四个字节(差四个字节是因为数组定义为整型,整型在内存中占四个字节) 。
得出结论:与一维数组的存储方式相同
数组作为函数参数
数组名作为函数参数时是首元素地址!!!
但是有俩个例外:是sizeof(数组名)和&数组名这俩个情况是取出的整个数组的地址
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = {10,9,8,7,6,5,4,3,2,1};
printf("&arr[0]的首地址:%p\n",&arr[0]);
printf(" arr[0]的首地址:%p\n", arr);
printf("-------------------------------------\n");
int len = sizeof(arr);
printf("数组长度为:%d\n", len);
printf("-------------------------------------\n");
printf(" arr的地址:%p\n",arr);
printf("&arr的地址:%p\n", &arr);
//为什么说&数组名取的是整个数组的地址,但显示的和上面语句显示的一样呢?
printf("-------------------------------------\n");
//我们可以再来看一个对比
printf(" arr+1的地址:%p\n", arr+1);//与之前相差4个字节
printf("&arr+1的地址:%p\n", &arr+1);//与之前相差40个字节,而40个字节正好是我们数组的长度
return;
}
运行结果:
实例冒泡排序:俩俩相邻的元素进行比较,按需交换
void bubble(int arr[],int len)
{
int t;
for (int i = 0; i < len; i++)
{
for (int j = i+1; j < 10; j++)
{
if (arr[i] > arr[j])
{
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
}
int main()
{
int arr[] = {10,9,8,7,6,5,4,3,2,1,11};
int len = sizeof(arr) / sizeof(arr[0]);
//确定数组长度,用于冒泡次数
bubble(arr,len);
for (int i = 0; i < len; i++)
{
printf("%d\t",arr[i]);
}
return;
}
实例1:三子棋(在主页资源中下载源代码)
实例2:扫雷游戏
~更新中