C语言之数组
数组
数组的概述
数组是由若干个相同类型的变量在内存中有序存储的集合
一维数组名是数组的首元素地址&a[0]
数组的定义
1.一维数组的定义
格式: 数组类型 数组名 [数组的元素的个数]
int a[10];
char b[5];
int a[] = {1,2,3};
2.二维数组的定义
格式:数组类型 数组名 【行的个数】【列的个数】
int a[2][3];
注意:在数组定义的时候,可以不给出行数,但是必须要给出列数,二维数组的大小由初始化行数来决定。
int a[][3]={1,2,3}; // 1行
int a[][3]={1,2,3,4}; // 2行
3.多维数组的定义
依次类推
数组的分类
1.按元素类型来分
char a[5]; // 字符数组
short a[5]; // 短整型数组
int a[5]; // 整形数组
long a[5]; // 长整型数组
float a[5]; // 浮点型数组
char* a[5]; // 指针数组
struct stu a[5]; //结构体数组
2.按维度分
从存储空间上来说,并无多维一说,统统都是一维。
2.1一维数组
int a[5]
类似于地里有一排萝卜坑,一个坑一个萝卜
2.2二维数组
int a[2][5]
类似与地里有两个大坑,一个大坑5个小坑,一个小坑一个萝卜
2.3三维数组
依次类推…
定义一个数组的时候,顺便给数组赋初值,及在开辟空间的时候同时赋值
数组的初始化
一维数组的初始化
1.全部初始化
int a[5] = {1,2,3,4,5};
2.部分初始化
int a[5] = {1,2,3};
赋值不足会自动补零。
二维数组初始化
1.全部初始化
int a[2][2]={1,2,3,4};
或者int a[2][2]={{1,2},{3,4}};
2.部分初始化
int a[2][2]={1,2,3};
或者int a[2][2]={{1,2},3};
赋值不足会自动补零。
数组的引用
一维数组的引用
数组名【下标】
int a[5];
a[0] , a[1] ... a[5]
二维数组的引用
数组名【行下标】【列下标】
int a[2][2];
a[0][0] , a[0][1] , a[1][0] , a[1][1]
字符数组的引用
char c1[] = {'h',' ','e','l','l','0'}; // 6字节
char c2[] = "h ello"; // 7字节
char a[][5]={
{'a','b','c','d','e'},
{'a','b','c','d','e'}
};
char a[][6]={"hello","world"};
1.用字符串方式赋值并用字符赋值的数组多占一个字节,用字符串方式赋值会多一个字符串结尾符’/0’
2.字符串方式的输入输出更方便一些。
//把前面50个元素初始化为100,后面50个元素赋值为200.
int a[100] = {[0 ... 49]=100,[50 ... 99]=200};
注意事项:
段错误:犹豫程序员在代码中访问了非法地址导致的。(指针没有初始化(野指针)、数组越界、指针乱指)
存储-》数组在计算机中连续挨个存储的
大小:
-
sizeof(); 求任意类型数据的大小
-
strlen(); 专门算字符串实际长度,不会算’\0’
include <string.h> size_t strlen(const char *s); size_t ----> unsigned int
空字符串、‘A’、"A"区别
- char buf[5] = “”;空字符串
- ‘A’ ------> 字符’A’ 单个字符
- “A” -----> 字符串 ‘A’‘\0’
清空数组
数组不清空,里面会是随机值。
1.bzero
#include <strings.h>
void bzero(void *s, size_t n);
参数1:s-->数组名
参数2:n-->数组的大小
例:int a[5];
bzero(a,sizeof(a));
2.memset
#include <string.h>
void *memset(void *s, int c, size_t n);
参数1:s-->数组名
参数2:c-->自定义初始值
参数3:n-->数组的大小
数组的怪异写法(了解)
int buf[10];
buf[0]=10; ---->等价于0[buf]=10;
int a[3][4]={12,13,{14},15,16,17}; // 错误的,不满足从左往右练习分组