一、 数组(数组是顺序表)
注意:数组越界编译器不检查,返回的是垃圾值;
1、int a[10]
(1)类型名(int[10])+ 变量名(arr)
(2)sizeof(a)=数组长度40
(3)数组一旦确定,数组大小就确定了
2、数组初始化
int a[10] 定义在函数内,数组内元素为垃圾值;
int a[10]={} 数组内元素为0;
int a[10]={1,} 数组不完全初始化,a[0]=1,其余为0;
int a[]={1,2,4} 数组完全初始化;
int a[10]={[3]=1} 数组可以指定元素初始化;
其余类型数组初始化同上
3、int a[10]
(1)数组名是地址常量,不能做左值;
(2)数组名不能++,++本质也是赋值运算,数组名是地址常量,不能改变,并且也没有这么多字节的数字赋值。
(2)左值为存储空间,右值为具体的内容(值),数组名作为右值,是地址值(为首元素首地址)
4、a[10] a与&a(虽然两个地址值相同,但是代表意思不同)
(1)a为数组首元素首地址(与&a[0]相同);&a为数组首地址(&a与&a+1相差一个数组大小)
(2)int (*p1)[10] =&arr;
int*p2=arr;
5 数组名做形参
例如: void fun (int a[10])
(1)数组名作为形式参数退化为指针,fun (int a[10])、fun (int a[])和fun (int *a)作用一样,a都做为指针,sizeof(a)=4(32位系统)。
(2)数组名作为形参要加上数组大小fun (int a[],10);
二、 字符串
1、定义
(1)C语言里没有字符串的原生类型,如string是C++,所有的字符串都是以字符数组的形式存储在内存中。
(2)字符串相当于提供了一个首地址,结束'\0'.整个区间就是字符串(不包含'\0')。
2、char str[] ="hello"
sizeof(str)=6(数组长度=字符串长度+1,1是’\0’);
strlen(str)=5(strlen以传入的地址为开始,统计长度,直至遇到’\0’为止,不包含’\0’长度)
3、对比
char arr1[]={‘a’,’b’,’c’}; 字符数组(不是字符串)
char arr2[]={“abc”}; 字符串
char arr3[]=”abc”; 字符串
sizeof(arr1)=3
sizeof(arr2)=4
sizeof(arr3)=4
4、字符串常量
char * P1=’abc’;
char* P2=’abc’;
(1)p1==p2
(2)字符串常量在代码段,是只读的(常量区),不能被改变。
*p1=’m’(是错误的,不能改变字符串常量)
(3)*p1==*p2==*”abc”;
5、字符串与字符数组
(1)字符串本质都是字符数组;
(2)只有以0结尾的字符数组才是字符串。