数组
目录
c
int a[3];//定义了有3个元素的数组,a[0],a[1],a[2]
- 数字型数组只定义部分元素时其他会被定为 0
- 若不确定数值,会有 2 中情况
- 未初始化的局部变量的值是随机的(在栈上分配的)
- 全局变量和静态变量的值是 0(在数据段分配的)
- 多维数组定义时只有第一维能省略
c
// 动态编译数组容易出错,一般不支持这么做
int n = 4;
int a[n];
c
int a[2];
int a[] = {1,2,3}; // 隐式定义数组长度
char str[] = "Hello";//注意长度为6,最后一个为\0
int *a;// 需要手动申请内存
二维数组
c
type name [x][y];//x为行数,y为列数
int a [3][4];
二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
多维数组元素在内存中的排列顺序:第一维的下标变化最慢,最右边的下标变化最快。
c
a[0][0][0]→a[0][0][1]→a[0][0][2]→a[0][0][3]→
a[0][1][0]→a[0][1][1]→a[0][1][2]→a[0][1][3]→
a[0][2][0]→a[0][2][1]→a[0][2][2]→a[0][2][3]→
a[1][0][0]→a[1][0][1]→a[1][0][2]→a[1][0][3]→
a[1][1][0]→a[1][1][1]→a[1][1][2]→a[1][1][3]→
a[1][2][0]→a[1][2][1]→a[1][2][2]→a[1][2][3]
多种赋值方式:
c
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][4]={ {1},{5},{9} };
int a[3][4]={ { 1 },{ 0,6 },{ 0,0,11 } };
int a[3][4]={ { 1 },{ 5,6 } } ;
int a[3][4]={ {1},{},{9}};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={ {0,0,3},{},{0,10}};
//一种更直观的定义方式
int a[3][4]={
{ 1,2,3,4 },
{ 5,6,7,8 },
{ 9,10,11,12 }
};
二维数组和指针
c
// 相当于一个指向数组开头的指针
a+1 //&a[1]
a[0]+1 //&a[0][1]
a //&a[0]
*a //a[0]//&a[0][0]
*a+i //&a[0][i]
*(a+i) //&a[i][0]
printf(“%p”,a);//输出数组的地址
printf(“%p”,&a[n]);//输出a[n]的地址
- 超下标运行(如赋值)可能导致本程序其他变量甚至其他程序出错
字符数组与字符串
每个字符数组元素存放一个字符,占用一字节
“字符串”结尾会默认加上\0 作为字符串结束标识符
c
char a[] = "abc";
//等价于char a[] = {“abc”};
//元素分别为‘a’,’b’,’c’,’\0’
char a[] ={'a','b','c'};
//元素分别为‘a’,’b’,’c’
a[0]="a",a[1]="b",a[2]="c";
//可以赋空格
若赋值的字符比定义的字符少,剩下的字符定义为‘\0’
处理字符串的函数
- 这些函数不能用于 string(用于 char 数组)
c
strlen();
//返回字符串长度(不包括\0)
c
strcat(字符数组1,字符数组2);
//拼接2个字符数组,返回字符数组1的首地址
//会去掉字符数组1的\0,前面数组不够时会超数组写,可能会导致其他数据出问题
c
strncat(字符数组1,字符数组2,数字);
//把字符数组2的前n给字符拼接到字符数组1的后面,返回字符数组1的首地址(也可不返回直接用)
c
strcmp<strncmp>(字符数组1,字符数组2<,数字>);
//比较2个字符串的<前n个>字符,直到出现不同的字符或遇到‘\0’结束,1>2返回1,其余返回0或-1
c
strcpy(字符数组1,字符数组2<,数字>);
//复制str2<的前n个字符>(包括‘\0’)到str1中去,返回str1的首地址
//字符数组2可以形如"hello"
//不要忘了\0(可以手动补)