vlambda博客
学习文章列表

C语言基础:“数组”

C语言基础:“数组”

Merry Christmas

C语言基础:“数组”

这里也可以是一个标题



数组:



#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