C语言基础:“数组”
Merry Christmas
这里也可以是一个标题
数组:
#include<stdio.h>
void main()
{
数组
/*
一组有固定大小,相同数据类型的数据的集合;是存储相同类型数据的仓库;
char;short;int;float;double;
数组可以分为:一维数组、二维数组、三维数组、。。。。。。(维数不止一维;多维数组表格;行和列(二维数组)
*/
1.一维数组:
(1)一般形式
类型说明符 数组名[常量或者常量表达式];
类型说明符 数组标识符[常量表达式];
类型说明符:数组中所有元素类型
数组标识符:数组名,跟变量的命名规则一样。字母,数字,下划线。
[] :下标运算符
常量或者常量表达式: 表示数组的大小,元素的个数(不是字节数),也就是数组的长度。只能是常量,不能是变量。符号常量:#define LENGTM 10 char arr[LENGTM];
错误:
/*
int n = 10;//变量
char arr[n];//不可以怎样定义,这是错误的,n为变量。而里面应该为常量
const int n = 10;//定义的常量,const常量是有办法去修改的,这是编译器定义下的不允许修改,实际是可以修改的;
char arr[n];//这也是错误的
正确:
char arr[50];
char arr[2 * 5];//数组的元素个数:10 ; 所占字节数:元素个数*sizeof(char)
*/
(2)访问数组里的每一个元素
通过下标访问得到每个元素的值。数组的下标从0开始:0=》数组的长度 - 1;如果数组长度为十,那么它的下标只能到九
/*
char array[10];
printf("%c\n",array[0]);
printf("%c\n", array[1]);
printf("%c\n", array[2]);
printf("%c\n", array[3]);
printf("%c\n", array[4]);
printf("%c\n", array[5]);
printf("%c\n", array[6]);
printf("%c\n", array[7]);
printf("%c\n", array[8]);
printf("%c\n", array[9]);//从0 =》 9
*/
(3)一维数组的初始化; 初始化就是在定义变量的时候给初值
几种方法:
[1]用花括号 { } 直接赋值;
/*
char arr[4] = { 'a', 'b', 'c', 'd' };//初始化列表
printf("%c\n", arr[0]);//下标是从0开始;0对应第一个字符;1对应第二个字符;2对应第三个字符;3对应第四个字符
printf("%c\n", arr[1]);
printf("%c\n", arr[2]);
printf("%c\n", arr[3]);
int arr1[5] = { 1, 2, 3, 4, 5 };
printf("%d\n", arr1[0]);
printf("%d\n", arr1[1]);
printf("%d\n", arr1[2]);
printf("%d\n", arr1[3]);
printf("%d\n", arr1[4]);
printf("%d\n", arr1[5]);//不可以访问,因为元素只有四个;下标越界。非常严重的问题,编译器不会检测,需程序员自己注意
*/
[2]只给部分元素赋值,没有赋值的元素默认赋值为0.
/*
float arr2[10] = { 12.0f, 78.5f, 9.0f, 6.2f };
int arr3[10] = { 0 };//全部初始化为0
printf("%f\n", arr2[0]);
printf("%f\n", arr2[1]);
printf("%f\n", arr2[2]);
printf("%f\n", arr2[3]);
printf("%f\n", arr2[4]);//没有给其赋值,默认为0。
printf("%f\n", arr2[6]);
printf("%f\n", arr2[9]);
*/
[3]对全部元素初始化的时候,不指定数组元素的长度
/*
int arr4[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
printf("%d\n", arr4[0]);
printf("%d\n", arr4[1]);
printf("%d\n", arr4[2]);
printf("%d\n", arr4[7]);
*/
[4]字符数组的初始化 , 不能表示字符串(1)
/*
char str[20] = "helloworld";//使用字符串的方式进行初始化,将其看做初始化列表
printf("%c\n", str[0]);
printf("%c\n", str[1]);
printf("%c\n", str[2]);
printf("%c\n", str[3]);
printf("%c\n", str[4]);
printf("%c\n", str[5]);
printf("%c\n", str[6]);
printf("%c\n", str[7]);
printf("%c\n", str[8]);
printf("%c\n", str[9]);
printf("%c\n", str[10]);//字符0没什么打印出来
printf("%c\n", str[11]);
printf("%c\n", str[19]);
char str[11] = "helloworld";//字符串长度一定要小于字符数组,因为还含有字符终止符“\0”,如果下标为10,那字符串终止符就没地方存,所以字符串长度一定要小于字符数组。
字符串终止符默认已经存入了
*/
[5]字符数组的初始化 , 不能表示字符串(2)
不指定数组元素的长度
/*
char str1[] = "helloworld";//此时的字符数组有
printf("%c\n", str1[0]);
printf("%c\n", str1[1]);
printf("%c\n", str1[2]);
printf("%c\n", str1[3]);
printf("%c\n", str1[4]);
printf("%c\n", str1[5]);
printf("%c\n", str1[6]);
printf("%c\n", str1[7]);
printf("%c\n", str1[8]);
printf("%c\n", str1[9]);
printf("%d\n", str1[10]);//打印的就是终止符
*/
(4)求一个数组所占内存大小
/*printf("占用:%d\n", sizeof(str1));*/
(5)数组元素的赋值
int arr5[10] = { 0 };
arr5[0] = 1;
arr5[1] = 2;
arr5[2] = 10;
arr5[3] = 8;
for (int i = 0; i < 10; i++)
{
arr5[i] = i * 2 / 3;
}
数组的遍历,即查看数组
for (int i=0; i < 10;i++)
{
printf("%d,", arr5[i]);//数组的访问可以是变量
}
printf("\n");
(6)数组所占的内存大小:数组的元素个数*元素类型所占内存(字节)大小。
一段连续的内存空间
数组所占的内存空间大小 = 数组类型*数组的长度(例:字符数组长度为10,它所占字节数为1,所以所占内存大小为10.)
char str1[] = "helloworld";
printf("占用:%d\n", sizeof(str1));
2.多维数组:超过一维的就是多维数组,二维数组、三维数组......
(1)二维数组:包含多个一维数组
一般形式:
/*
数据类型 数组名[常量表达式1][常量表达式2]
int arr[10];//一维数组
char arr[2][5];//二维数组
float arr[2][3][5];//三维数组
double arr[2][3][4][5];//四维数组
在内存中:一块固定大小,连续的内存空间
*/
int arr[3][8];//前面的下标表示一维数组的大小,后面的这个下标表示每一个一维数组的长度,每一个一维数组的长度都是相同的。
表示3个一维数组,每一个一维数组里面有8个元素,且三个一维数组的长度都相同,都为8.
3 行 8 列
(3)二维数组的初始化; 初始化就是在定义变量的时候给初值
几种方法:
[1]用花括号 { } 直接赋值;按顺序排列
int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
1-5:第一个一维数组;6-10:第二个一维数组;11-15:第三个一维数组。
arr[0][0];//表示第一行的第一个数组,即 1
printf("%d\n", arr[0][0]);// 表示第一行的第一个数组, 即 1
printf("%d\n", arr[0][1]);//表示第一行的第二个数组,即 2
printf("%d\n", arr[0][2]);//表示第一行的第三个数组, 即 3
printf("%d\n", arr[0][3]);
printf("%d\n", arr[0][4]);//表示第一行的第五个数组,即 5
printf("%d\n", arr[1][0]);//表示第二行的第一个数组,即 6
printf("%d\n", arr[1][4]);//表示第二行的第五个数组,即 10
printf("%d\n", arr[2][0]);//表示第三行的第一个数组,即 11
printf("%d\n", arr[2][4]);//表示第三行的第五个数组,即 15
[2]只给部分元素赋值,没有赋值的元素默认赋值为0.
int arr1[10][10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
printf("%d\n", arr1[0][0]);
printf("%d\n", arr1[0][1]);
printf("%d\n", arr1[0][2]);
printf("%d\n", arr1[0][3]);
printf("%d\n", arr1[1][0]);// 11
printf("%d\n", arr1[1][1]);
printf("%d\n", arr1[2][0]);
printf("%d\n", arr1[2][1]);
printf("%d\n", arr1[2][2]);
[3]可以省略行下标,但是不能省略列下标
int arr2[][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//由花括号里面数的长度可以知道,此数组为 2 行 5 列。
不能省略列下标,因为不能看出是几列;例:int arr3[5][]={1,2,3,4,5,6,7,8,9,10}; 可以知道有五个一维数组,但不能知道一行有几列。
编译器是根据一维数组长度来划定二维数组的大小。
[4]用 { } 括起来,分行给它赋值(花括号里面又有花括号)
/*
int arr4[3][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 } };
*/
/*
int arr5[3][5] = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
};
*/
/*
int arr6[3][5] = {
{ 1, 2, 3 },
{ 6, 7},
{ 11 }
};
遍历二维数组
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d", arr6[i][j]);
}
printf("\n");
}
*/
数组在内存中存储实际:是一段连续的内存空间,中间不间断
/*
int arr7[4][5] = {
{ 1, 2, 3 ,4,5},
{ 6, 7 ,8,9,10},
{ 11, 12, 13, 14, 15 },
{16,17,18,19,20}
};
printf("%d\n", arr7[0][5]);//越界;输出 行的下标最高为2(0,1,2),列的下标最高为4(0,1,2,3,4) //越界了第一个一维数组,访问内存后面的元素。输出:6
越界:因为数组在内存中是一段连续的内存空间,越界只是越界了第一个一维数组,访问内存后面的元素。
printf("%d\n", arr7[1][10]);//越过第一个一维数组,访问它后面的第十个数,输出16
*/
多维数组
24个元素
int arr8[2][3][4] = //表示 2 个相同二维数组
{ {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
},
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
} };
遍历三维数组
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
for (int m = 0; m < 4; m++)
printf("%d\t", arr8[i][j][m]);
}
printf("\n");
}
printf("\n");
3.const常量
不能够修改的量,一定要初始化
只读变量
const int i=12;
int arr[i];不能这样,下标一定要是常量,而const常量可以改变
const int i=1;
char arr[i]={0};
}
新浪微博:@秀米XIUMI