初识C 语言以及拓展:
- #include <stdio.h>//保含一个stdio.h(标准输入输出函数)的文件
int main() //主函数-程序的入口-main函数有且只有一个
{
printf(“hello world\n”);
return 0;
}
- int代表整型的意思,main前面的int表示main函数调用返回一个整数值,上述程序就是返回一个整数值0.
- 数据类型的大小(以字节为基本单位):
- 计算机的中的单位及转换:
bit-比特位(最小单位)
byte-字节(一个字节相当于八个比特位)
kb(相当于1024个字节)
mb(相当于1024个kb)
gb(相当于1024个mb)
tb(相当于1024个tb)
pb(相当于1024个pb)
- 变量、常量:生活中的有些值是不变的(比如:圆周率,性别(?),身份证号,血型等),有些值是可变的(比如:年龄,体重,薪资)。不变的值,C语言中常量的概念来表示,变得值用变量来表示。(注意C语言定义变量时要定义在当前代码块的前面)
- 局部与全局变量:
部分代码:
int a=20;//全局变量-定义在代码块({})之外的变量
int main()
{
int a=10;//局部变量-定义在代码块({})之内的变量
return 0;
}
这里的运行结果是:10
- 拓:局部变量与全局变量可以同时存在,且当局部变量与全局变量的名字相同的情况下,局部变量优先。(局部变量与全局变量的名字不要相同,容易产生bug)
- 拓;如果此时代码这样写,则会报错,原因是未声明变量a,a的作用范围只在它的{}代码块内,之外不能使用。
int main()
{
{
int a=10;//局部变量-定义在代码块({})之内的变量
}
return 0;
}
- 变量的作用域和生命周期:
作用域:变量哪里可以用哪里就是它的作用域。局部变量的作用域就是所在代码块内,全局变量的作用域是整个工程,任何地方都可以用。
生命周期:
局部变量的生命周期:进入作用域生命周期的开始,出作用域生命周期结束。
全局变量的生命周期:整个程序的生命周期。
- “#define _CRP_SECURE_NO_WARNINGS 1” 把这一串代码放在程序源文件的第一行可以防止使用scanf函数时产生警告。
学会用Notepad++更改VC的属性,在源文件的第一行默认加上上述代码。
- 常量:C语言中的常量分为以下几种:
- 字面常量(直接的值)
- const修饰的常变量(const指的是常属性)
- #define定义的标识常量
- 枚举常量
拓:const常属性的应用:
注意常变量与常量的区别。
- 枚举关键--enum
拓:这里的man,woman,secret为枚举常量,且这些东西是有值不可改变的。
举例:
这里的man的值无法改变。
- 字符串+转义字符+注释
- 字符串:”hello bit\n”这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。(注意:字符串的结束标志是\0的转义字符。在计算字符串长度的时候\0是结束标志,不算做字符串的内容,详细见下面的图片计算arr1时长度为3)
拓:strlen--string length(用于计算字符串长度的),在应用前要先有#include <string.h>z这个头文件才能使用。
这里计算两个数组中字符串的长度不一样,原因是arr2数组里没有“\0”,导致函数一直计算直到遇到\0才停止计算,所以结果是42也可以称作随机值。若此时将arr2【】数组中加一个0,则输出结果则为两个三。
注:这里的波浪号报的警告查阅相关资料发现是strlen函数返回一个值的时候返回的是一个64位(8byte)的整型,而int(%d)只返回4byte(32位),所以不对,占位符错误。详细
资料如下:
- 转义字符:
\? 在书写连续多个问号时使用,防止他们被解析成三字母词。
\’ 用于表示字符常量’
\” 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释成一个转义序列符。(转义的转义就是正常可以理解为负负得正)
\a 警告字符,蜂鸣。
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd表示1-3个八进制的数字。如:\130X
\xdd dd表示2个十六进制数字。如:\X300
- 注释:有两种风格
- C语言风格的注释/*xxxxx*/
缺陷:不能嵌套注释
- C++风格的注释//xxxxxxxx
可以注释一行也可以注释多行
- 引用类型的使用:引用的意思是它给一个对象提供一个替代的名字。
这里引用j来替代i的名字,换汤不换药,当你动i的值的时候,j的值也会改变,因为j是换了名字的i。
#include <stdio.h>
void main()
{
int i = 5;
int& j = i;
printf("%d,%d\n", i, j);
i = 10;
printf("%d,%d\n", i, j);
}
拓:引用类型作为形参的三点说明。
- 传递引用给函数与传递指针的效果是一样的,形参变化实参也反生变化。
- 引用类型作为形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。
- 指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。
- 拓:关键字cout,cin的语法使用:
Cout:具体操作-- cout<<想要输入的内容(在使用cout时必须包含<iostream>的头文件,且这里的<<是流插入运算符),而cin:cin>>想要输出的内容,一个是输入一个是输出,并且两者均可以自动识别类型(字符型、整型等)
- 分配内存空间函数malloc(),调用形式为:
类型说明符 *p=(类型说明符*)malloc(size)
程序向系统“打报告”需要大小为size字节的储存空间。在系统内存充足的情况下,会返回所分配空间的起始地址。这个时候需要定义一个指针变量将这个地址保存下来,以便后面使用。程序通过强制转换指明这个空间用来储存什么类型的空间。
- 学会了使用Gitee来储存自己写的代码
- 学习了结构体指针:
typedef struct
{
char no[20];//图书书号
char name[50];//图书书名
float price;//图书价格
}Book;
typedef struct//创建一个顺序表
{
Book* elem;//存储空间的基地址
int length;//记录图书表中当前的实际图书个数
}Sqlist;//图书表的顺序存储结构类型为Sqlist
Status Initlist(Sqlist&L)
{//构造一个空的顺序空表
L.elem = new Book[MAXSIZE];//为为顺序表分配一个大小为MAXSIZE的数组空间
if (!L.elem) exit(OVERFLOW);//存储分配失败退出
L.length = 0;//空表长度为0
return OK;
}
这里的Book*elem指针的意思是指向L这个结构体数组的基地址的Book类型指针与L.elem意思相同。根据以上的伪代码可以得到一个理论图。
注:L.elem[i]指的是所对应的Book型结构体,而L.elem+i则指的是所对应的Book结构体的地址,要想用Book里面的东西则必须是L.elem[i].no或(*(L.elem+i)).no。(要注意这里的运算优先级“.”的优先级是高于“*”,所以在不加()的情况下系统会优先识别“.”,如果不注意会发生一些错误)
- 拓:结构体与结构体之间比不了大小,原因在于,结构体中有那么多的变量,如果拿整体比较系统不知道要比较哪个,所以不行。(但如果真的想比较那就比较结构体里的变量)例如
#include <stdlib.h>
#include <stdio.h>
struct A
{
int a;
int b;
};
int main()
{
A x = { 1,0 };
A y = { 5,4 };
x == y;
}
判断两个结果体变量相等的条件是x.a==y.a&&x.b==y.b,y以上问题都是从数据结构顺序表与链表的学习过程中产生的问题,然后进行相关资料的查阅以及学长学姐的指导得以解决。