C语言从零开始——day3(数组初识)

第三节


####   认识数组   ####

        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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值