第三节
#### 认识数组 ####
int arr[5] = {1,2,3,4,5},i = 0; //整型数组,完全初始化
//int表示该数组为整形数组
//[]是一个运算符,专用于数组,优先级很高
//arr:表示数组名,在编译器看来,数组名是一个地址,为常量
//arr[0]:表示首元素的变量名
//元素的变量名(不是数组名)在左值和右值代表的意义不同。具体:作为左值时,表示改变该元素名;作为右值时,表示用该元素名赋值。
//例如:arr[5] = 5; a = arr[5]
//int arr[5] = {[2]=5};//该定义表明:第三个元素名为5,其余初始化为0
//如果只是单纯定义一个数组,int arr[5]; 该过程无初始化
//数组是连续存储在内存中的一种数据结构,是顺序表
while(i < 5) //遍历数组
{
printf("arr[%d] = %d \n",i,arr[i]);
i++;
}
#### 考虑“数组名”问题 ####
#include <stdio.h>
int main(void)
{
//定义数组并初始化;数组是一种数据结构,这就要求,指定的数据类型和元素类型必须一致
int arr[10] = {1,2,3,4,};
//arr为数组名,在编译器看来,arr是数组元素的首地址
//考虑问题:数组名可以是左值,右值吗?
//解答:数组名不能是左值;原因1,没有绝对的相关变量类型与之匹配;原因2,数组名在编译器看来是地址,地址为常量,常量不可更改
//解答:数组名可以是右值;表示将地址赋值给左值变量
int a = 3;
//左值:代表可以存储数据的内存空间
//右值:代表空间里的内容
return 0;
}
注意一个易犯错问题:
int num = 5;
int arr[num] = {}; //这是错误的写法!注意:数组大小必须为常量,不能是变量
#### 数组越界问题 ####
int arr[5] = {1,2,3,4,5},i = 0;
for (i=0;i<6;i++) //注意:i=5时,已经越界。
{
printf("arr[%d] = %d \n",i,arr[i]);
}
//越界后,会发现测试打印出来的越界位的数值是随机的,这也进一步说明,栈是脏的
//注意:数组越界,编译器不会检查出来! 数组的越界问题,编译器对数组不进行边界检查,这样可以提升程序的执行效率,但降低了安全性。
#### 字符形数组中的ASC值 ####
#include <stdio.h>
//问题:定义的buf1和buf2表示的意义一样吗?
//考虑问题:1,整个过程中i的变化历程。2,数组有没有越界?3,if+else结构,能否证明我们的预期打印情况
int main(void)
{
char buf1[3] = {'A','B','C'};
char buf2[3] = {65,66,67 };
int i = 3,flag = 0;
while (i--) //i的遍历:3-->2;2-->1;1-->0;0-->-1(这次不进入循环)
{
printf("check flag i = %d \n",i);
if(buf1[i] != buf2[i]) //判断buf1[i]和buf2[i]元素名是否一样;不一样条件成立,对flag重新赋值
{
flag = 1;
break;
}
}
printf("check flag 2 i = %d \n",i); //这块检查,上面while后i的值的结果
if (!flag)
printf("Right!!! \n");
else
printf("error!!! \n");
printf("test enter");
putchar('\n'); //这表明传入的参数是10,对应的ASC码是10,把这个字符输出>到输出设备,也是换行的意思
}
上面代码证明:buf1和buf2表示的意义一样;体会char类型中字符和对应ASC码值的对应关系
#### 区分0 '\0' '0' ####
//字符串进行初始化时,字符串结尾需要一个'\0',作为结束标志
//理解:0 ‘\0’ 和'0'之间的区别
//0是数字
//'\0'是一个字符(空字符),占内存空间一个字节大小,对应的ASC码值是0,'\0' == 0
//'0'是字符0,对应的ASC码是48
char buf1[] = "ABC";
char buf2[] = {'A','B','C',};
//考虑,这两个数组有什么不同
//结论:buf1占据四字节大小,buf2占据三字节大小
if(sizeof(buf1) == sizeof(buf2))//该if+esle结构用来判断两个数组是否一样>(在占据空间大小上都不一样)
puts("== \n");
else
puts("!= \n");
#### 关于'\0'的运用 ####
char buf[] = "12345";
//注意:buf是整个数组元素的首地址
printf("buf = [%s] \n",buf); //输出结果为12345
printf("sizeof(buf) = %d \n",sizeof(buf)); //输出结果为6
//strlen函数:计算字符串中有效字符个数
printf("strlen(buf) = %d \n",strlen(buf)); //输出结果为5