C语言--数组

C语言--数组

概述:

所谓数组,就是一个集合,里面存放相同类型的数据元素

特点:

数组中的每个元素都是相同的数据类型

数组是由连续的内存位置组成的

一、一维数组

1、三种定义方式:

数据类型 数组名[元素个数]数据类型 数据名[元素个数]={值1,值2,值3,。。。。};数据类型 数据名[ ]={值1,值2,值3,。。。。};

#include

#include

void test() {

//定义方式一

//数据类型 数组名[元素个数]

int score[10]; //数组名为score,数组中最多是10个元素,数据类型是int

//给数组中元素赋值

//利用下标,从0开始计算

score[0] = 100;

score[1] = 90;

score[2] = 80;

//score[10] = 100; //error--下标访问越界

printf("%d\n",score[0]);

printf("%d\n", score[1]);

printf("%d\n", score[2]);

//定义方式二

//数据类型 数据名[元素个数]={值1,值2,值3,。。。。};

//int score2[10] = {1,2,3,4,5,6,7,8,9,10};

//部分初始化数组

int score2[10] = { 1,2,3,4 }; //不足10个数据,其余位置用0填充

//int score2[10] = {[0]=10,[5]=50,[7]=70};//很少使用,了解就好

for ( int i = 0; i < 10; i++)

{

printf("%d\n",score2[i]);

}

//定义方式三 与方式二的区别--方式三没有说 元素个数

//数据类型 数据名[]={值1,值2,值3,。。。。};

int score2[] = {1,2,3,4,5,6,7,8,9,10};//可以省略元素个数,但是一定要说明值是说明

}

int main() {

test();

system("pause");

return 0;

}

2、一维数组名称的作用

可以统计整个数组在内存中的长度可以获取数组在内存中的首地址

#include

#include

void test1() {

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

//1.统计整个数组占用内存的大小

printf("sizeof arr = %d\n",sizeof(arr));

printf("每个数据占用空间大小 = %d\n", sizeof(arr[0]));

printf("数组中元素的个数 = %d\n", sizeof(arr) / sizeof(arr[0]));

//2.通过数组的名称,可以取得数组的首地址

printf("数组的首地址为 = %d\n", arr); // %p--用十六进制显示地址 %d--用十进制显示地址

printf("第一个元素的地址为 = %d\n", &arr[0]);

printf("第二个元素的地址为 = %d\n", &arr[1]);

printf("第三个元素的首地址为 = %d\n", &arr[2]);

//数组名是常量,不可以赋值

//arr = 100; //error 不可以给数组名赋值

}

int main() {

test1();

system("pause");

return 0;

}

3、冒泡排序

作用:常用的排序算法,对数组内元素进行排序。

1.对比相邻的元素,如果第一个比第二个大,就交换它们两个

2.对每对相邻元素做相同的动作,执行完毕后,找到第一个最大值

3.重复以上步骤,每次比较次数-1,直到不需要比较

#include

#include

//冒泡排序

//将数组{4,2,8,0,5,7,1,3,9}按照升序排序

void test2() {

int arr[9] = { 4,2,8,0,5,7,1,3,9 };

//外层循环

for (int i = 0; i < sizeof(arr) / sizeof(int)-1; i++) //对比轮数

{

//内层循环

for (int j = 0; j < sizeof(arr) / sizeof(int)-1-1; j++) //对比次数

{//对比相邻的元素,如果第一个比第二个大,就交换它们两个

if (arr[j]>arr[j+1]) {

int temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}

for (int i = 0; i < sizeof(arr)/sizeof(int); i++)

{

printf("%d ",arr[i]);

}

printf("\n");

}

int main() {

test2();

system("pause");

return 0;

}

运行结果:

二、二维数组

1.定义方式

数据类型 数组名 [行数] [列数];数据类型 数组名 [行数] [列数] = { {数据1,数据2} , {数据3,数据4}.......}; 推荐!!!!数据类型 数组名 [行数] [列数] = { 数据1,数据2,数据3,数据4.......};数据类型 数组名 [ ] [列数] = { 数据1,数据2,数据3,数据4.......};

#include

#include

//二维数组

void test() {

//方式一:数据类型 数组名 [行数] [列数];

int arr[2][3];

arr[0][0] = 1;

arr[0][1] = 2;

arr[0][2] = 3;

arr[1][0] = 4;

arr[1][1] = 5;

arr[1][2] = 6;

//通过循环输出

for (int i = 0; i < 2; i++) //行

{

for (int j = 0; j < 3; j++) { //列

printf("%d ",arr[i][j]);

}

printf("\n");

}

//方式二:数据类型 数组名 [行数] [列数] = { {数据1,数据2} , {数据3,数据4}.......};

int arr2[2][3] = { {1,2,3},

{4,5,6} };

//方式三:数据类型 数组名 [行数] [列数] = { 数据1,数据2,数据3,数据4.......};

int arr3[2][3] = {1,2,3,4,5,6};//二维数组的本质是一维数组,人为的加了一个维度,地址是连续的

//方式四:数据类型 数组名 [ ] [列数] = { 数据1,数据2,数据3,数据4.......};

int arr3[ ][3] = { 1,2,3,4,5,6 };

}

int main() {

test();

system("pause");

return 0;

}

2、二维数组的名称

查看二维数组所占内存获取二维数组首地址

#include

#include

//二维数组名称

void test1() {

int arr[2][3] = { {1,2,3},

{4,5,6} };

//查看二维数组所占内存

printf("二维数组所占内存为:%d\n",sizeof(arr));

printf("二维数组每行所占内存为:%d\n", sizeof(arr[0]));

printf("二维数组每个元素所占内存为:%d\n", sizeof(arr[0][0]));

//获取二维数组的行列数

printf("二维数组的行数为:%d\n",sizeof(arr)/sizeof(arr[0]));

printf("二维数组的列数为:%d\n", sizeof(arr[0]) / sizeof(arr[0][0]));

//获取二维数组首地址

printf("二维数组的首地址是:%d\n",arr);

printf("二维数组第一行的地址是:%d\n", arr[0]);

printf("二维数组第一个元素的首地址是:%d\n", &arr[0][0]);

printf("二维数组第二个元素的首地址是:%d\n", &arr[0][1]);

}

int main() {

//test();

test1();

system("pause");

return 0;

}

三、字符数组

1、数组的定义方式以及初始化

#include

#include

//字符数组的定义方式

void test() {

char ch[5]; //声明一个字符数组,一共五个元素,每个元素都是char类型

printf("%d\n",sizeof(ch));

}

//数组初始化

void test1() {

//逐个初始化

//char arr[5] = {"h","e","l","l","o"}; //error--没有\0的位置,因此输出的时候会有乱码

//char arr[6] = { "h","e","l","l","o" }; // \0的本质就是 0

//遍历字符数组

char arr[6] = "hello";

printf("%s\n",arr);

}

int main() {

//test();

test1();

system("pause");

return 0;

}

2、字符串长度统计

字符串统计函数:strlen()

头文件:#include

#include

#include

#include

//字符串长度统计

void test2() {

char arr1[25] = "hello word!";

printf("这个字符串的长度是:%d\n",strlen(arr1)); //strlen在统计的时候,不统计\n,只统计有效字符

printf("这个字符串的长度是:%d\n", sizeof(arr1)); //sizeof统计整个数组所占的内存大小

char arr2[ ] = "hello word!";

printf("这个字符串的长度是:%d\n", strlen(arr2));//11

printf("这个字符串的长度是:%d\n", sizeof(arr2));//12

char arr3[] = "hello \0word!";

printf("这个字符串的长度是:%d\n", strlen(arr3));//6 strlen遇到/0,结束统计,并且不统计/0

printf("这个字符串的长度是:%d\n", sizeof(arr3));//13

}

int main() {

//test();

//test1();

test2();

system("pause");

return 0;

}

3、字符数组常用的输入输出

输入

#include

#include

#include

//字符数组输入

void test3() {

//创建字符数组,且初始化为空

char arr3[16] = " ";

//char arr3[16] = { 0 }; //效果一样的,都是初始化数组

scanf("%s",arr3); //遇到空格会结束输入

printf("%s\n",arr3);

strcpy(arr3,"hello word");

printf("%s\n",arr3); //需要包含头文件--#include

}

//gets 不推荐

void test4() {

char arr4[16] = " ";

gets(arr4); // 遇到换行符(回车)才结束,可以输入空格

//不会监测数据是否溢出。一旦数据溢出,程序终止

printf("%s\n",arr4);

}

//fgets 推荐

void test5() {

char arr5[16] = " ";

fgets(arr5,sizeof(arr5),stdin); // stdin--标准输入设备(默认是键盘)

printf("%s\n", arr5);

}

//

int main() {

//test3();

//test4();

test5();

system("pause");

return 0;

输出

#include

#include

#include

//输出 puts fputs

void test6() {

char arr6[16] = "hello word!";

printf("%s\n", arr6);//常用

//自带换行

puts(arr6);

fputs(arr6,stdout); //stdout--代表标准输出设备(默认屏幕),不带换行

}

int main() {

test6();

system("pause");

return 0;

}

相关推荐