C语言学习记录

      C语言菜鸟刚刚起步,希望自己能够坚持下去,坚持敲代码,坚持记录和总结。

       2021.10.15

       知识点总结:

       1.计算机为了更加丰富的表达生活中的各种值,存在众多的数据类型。有char(字符数据类型、1个字节)、short(int)(短整型、2个字节)、int(整形、4个字节)、long(int)(长整形、4个字节)、long long(更长的整形、8个字节)、float(单精度浮点数、4个字节)、double(双精度浮点数、8个字节)、long double(多精度浮点数、VS 8个字节)

 这里我还想到了后面的数据的存储(包括大端、小端存储及浮点数的存储),等以后学到了再做总结。

       2.变量和常量

       2.1变量分为局部变量和全局变量

如:

上面的代码中,局部变量global的定义是没有问题的,当局部变量和全局变量同名的时候,局部变量优先使用。

       2.2变量的作用域和声明周期

作用域:作用域(scope)是程序设计概念,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

①局部变量的作用域是变量所在的局部范围;

②全局变量的作用域是整个工程。

生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。

①局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期结束。

②全局变量的生命周期是整个程序的生命周期。

       2.3常量的类型分为:字面常量、const修饰的常变量、#define定义的标识符常量和枚举常量

举例:

其中被const修饰的常变量在语法层次被限制了修改,但它本质上还是变量,而不是常量,并不能用于数组的初始化(如const i = 5; int arr [ i ],但是C99标准中允许这么使用),因此叫常变量。

     

       2021.10.17

       知识点总结:

       转义字符。

1.\?:在书写连续多个问号时使用,防止他们被解析成三字母词。举例:??)  ---->  ],在三字母词中两个问号加一个括号等于一个方括号,这时如果这样打印:printf ( "(hehe??)" ),输出的结果就是( hehe ]。因此为了避免这种情况,应该这样打印:printf ("(hehe\?\?)"),进行转义。

2.\'用于表示字符常量 ' 。举例:当我们要打印一个 ' 的时候,printf ("%c\n", ' ' '),这个时候并不会正确的打印 ' ,因为它与最近的 ' 结合。因此要这么打印:printf ("%c\n",' \' '),才会正确的输出 ' 。

3.\"用于表示一个字符串内部的双引号。具体用法与②中相同。

4.\ \ 用于表示一个反斜杠,防止它被解释为一个转义序列符。

5.\a 警告字符,蜂鸣。

6.\b 退格,将当前位置移到前一列。

7.\f 换页,将当前位置移到下一页开头。

8.\n 换行,将当前位置移到下一行开头。

9.\r 回车,将当前位置移到本行开头。

10.\t 水平制表,跳到下一个TAB位置。

11.\v 垂直制表符。

12.\ddd ddd表示1~3个八进制的数字,如\130 X。

13.\xdd dd表示2个十六进制数字,如\x30 0。

经典例题:

 结果输出6和14

其中第二个字符串这样理解:c : \ t est \62 8 \t est . c,\ddd表示8进制,所以8不能一起算。

注:strlen计算字符串长度,遇到\0才会停止。如果char arr[]={'a','b','c'};strlen(arr),则输出随机值,因为结尾没有’\0‘。

       

       2021.10.19

       知识点总结:

       1.操作符

       ①移位操作符:<<(左移操作符)和>>(右移操作符)

<<左移操作符

移位规则:左边移出去的二进制位舍弃,右边补0。

如:int num = 10;

num<<1

 00000000000000000000000000001010      num在内存中的二进制

000000000000000000000000000010100   左移移位,最左边的0舍弃,右侧补上一个0

>>右移操作符

移位规则:1.逻辑移位:右边移出去的二进制位舍弃,最左边用0补齐。

                  2.算数移位:右边移出去的二进制位舍弃,最左边用原来该值的符号位补齐,如果原来是正数,用0补齐,如果是负数,用1补齐。

如:int num = -1 

11111111111111111111111111111111     num在内存中的存储(数据在内存中以补码的形式存储)

原码符号位不变,其余位取反--->反码,反码+1--->补码

011111111111111111111111111111111(逻辑移位)

111111111111111111111111111111111(算数移位)

如果是+1,则

000000000000000000000000000000001(算数移位)

注:移位操作符的操作数不能是负数,如:num>>-1,是错误的。

       

       ②位操作符:&(按位与)、^(按位异或)、|(按位或)

3-00000000000000000000000000000011

5-00000000000000000000000000000101

&-00000000000000000000000000000001--1

二进制位同时为1则为1,否则为0

3-00000000000000000000000000000011

5-00000000000000000000000000000101

^-00000000000000000000000000000110--6

二进制位相同取0,不同取1

3-00000000000000000000000000000011

5-00000000000000000000000000000101

| -00000000000000000000000000000111--7

二进制位同时为0则为0,否则为1

&(按位与)、| (按位或)要和&&(逻辑与)、||(逻辑或)区分开

注:①.sizeof也是一个单目操作符。2.~ 是对一个数的二进制位按位取反。

       ②.(类型)强制类型转换。

     

        2.关键字

①.typedef---类型重命名

②.static 

 static在C语言中是用来修饰变量和函数的

修饰局部变量---称为静态局部变量

修饰全局变量---称为静态全局变量

修饰函数---成为静态函数

1.修饰局部变量

 计算机在内存中有栈区、堆区、静态区等。局部变量存储在栈区中,全局变量和静态变量存储在静态区中。当用static修饰局部变量时,其实就是改变了变量的存储类型,使其从栈区存储变成了静态区,从而使得静态的局部变量出了自己的作用域也不会销毁,其实相当于让这个局部变量的生命周期变得和全局变量一样,在程序结束之后才释放。注:静态局部变量的作用域并没有变,只能在函数内部使用。

例:

在上面的代码中,y()函数阿里的 i 就是一个局部变量,它在进入y()函数的时候创建,在出y()函数的时候销毁,因此每一次调用y()函数的时候,i都是1,然后自增,所以输出结果都是2。

如果我们在 i 的前面加上static,则:

每一次出y()函数的时候 i 都不会被销毁,输出结果变成了2~11。

2.修饰全局变量

 这里我们在一个源文件中成功打印了另一个源文件中的变量。(注:在一个源文件中想要调用另一个文件中的全局变量,需要extern+类型+变量。)

如果我们在g_val前加上static,则:

 程序运行之后显示无法解析g_val。

一个全局变量能够在工程的其他文件中使用,是因为全局变量具有外部链接属性,当一个全局变量被static修饰的时候,这个变量的外部链接属性就变成了内部链接属性,使得这个全局变量只能在自己所在的源文件内部使用,其他文件不能使用,给我们的感觉就是它的作用域变小了。但是它的生命周期不变,依然是整个工程。

3.修饰函数

static修饰函数的效果与修饰全局变量类似。

这里我们在一个源文件中调用了另一个文件中的Add函数,并成功输出结果。(注:同样的,extern+类型+函数)。

如果我们在Add函数的前面加上static,则:

 此时程序显示无法解析Add函数。

同样的,函数在被static修饰之后,原本的外部链接属性变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能再其他文件中被使用,给我们的感觉就是使得函数的作用域变小了。

       2021.10.21

       知识点总结:

初识指针:

1.&--取地址操作符。&a取出的是该变量所占4个字节空间的第一个字节的地址(即地址小的那一个字节,这里的a的类型是int。类型决定了解引用的时候可以访问几个字节。)

2.指针的大小

 在32位平台下,指针的大小都是4个字节;

 而在64位平台下,指针的大小都是8个字节;

初识结构体:

1.创建结构体变量时,大括号后面要加上分号;

2.结构体成员打印时,有两种方法:第一种是结构体变量名称+ . +结构体元素;第二种方法:将结构体地址+ -> +结构体元素。

       值得记录的题目

1.描述:从键盘输入5个学生的成绩(整数),求他们的平均成绩(浮点数,保留一位小数)

   输入描述:一行,连续输入5个整数(范围0~100),用空格分隔。

   输出描述:一行,输出5个数的平均数(保留移位小数)。

   示例:输入:75,80,43,67,96

              输出:72.2

代码:

 注:①.用for循环的方式比创建5个int变量更加简洁;

        ②.关于浮点数的打印:printf("%6.2f",floatNum):保留两位小数。 

说明:%6.2f表明待打印的数(floatNum)至少占6个字符宽度(包括两位小数和一个小数点),且小数点后面有2位小数,小数点占一位,所以整数部分至少占3位。例:100.1打印出来就是100.10

        ③.输出结果的时候,sum/5.0,不能写成sum/5。

2.描述:将一个四位数,反向输出。

   输入描述:一行,输入一个整数n(1000<=n<=9999).

   输出描述:针对每组输入,反向输出对应四位数。

   如:输入1234,输出4321。

本题自然有多种做法,在此一一记录:

 这是我写的比较“朴素”的写法,将输入的四位数拆开,再反向打印。

这里用while循环,从四位数的最后一位数开始打印,打印完之后将n/10,把最后一位数去掉,如此循环。

 这是我在牛客网评论中看到答案

       

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值