C语言学习笔记(一)—— 整体了解

简介

最开始人们使用二进制进行软件的编写,为了方便慢慢衍生出了助记符,使得汇编语言诞生了。之后高级编程语言,C语言才慢慢诞生。为了使C语言写的程序在不同的地方都可以使用,推出了C语言标准语法(C89、C90、C99、C11...)。C语言是面向过程的编程语言,C++/Java等是面向对象的编程语言。

常见的C语言的编译器:clang(苹果系统)、GCC(Linux平台)、MSVC(windows,VS);

Visual Studio:下载免费的社区版就可以~

PS:【自定义安装组件:1)使用C++的桌面开发;2)Visual Studio 扩展开发】

流程:1)创建空项目——【1、项目名称不要有空格、特殊字符、中文;2、一定要自己设置路径;3、创建完成后如果没有看到项目,点击‘视图->解决方案资源管理器’】;2)创建.C文件——【’源文件->添加->新建项‘,选C++文件将后缀.cpp改成.c就好了,cpp会按照C++的语法编译】;3)写代码;4)【编译—>链接—>可执行程序.exe】—— vs是集成开发环境,这一步可以自动完成:CTRL+F5;

一、main函数

#include <stdio.h>  // 这是调用标准库
int main()
{
return 0;
}
  • int:是返回类型;
  • 大括号{}括起来的是函数体;

C 语言中main函数是程序的入口,项目从main函数的第一行开始执行,因此main函数有且只能有一个;

二、数据类型

#include<stdio.h>
int main()
{
//sizeof是一个操作符,计算类型/变量所占内存空间的大小
//“%d”的意思是以十进制的形式打印一个整数;“/n”是换行
printf("%d/n",sizeof(char));
printf("%d/n",sizeof(short));
printf("%d/n",sizeof(int));
printf("%d/n",sizeof(long));
printf("%d/n",sizeof(long long));
printf("%d/n",sizeof(float));
printf("%d/n",sizeof(double));
printf("%d/n",sizeof(bool));
return 0;
}
  • char——字符型【1字节】;
  • short——短整型【2字节】;
  • int——整型【4字节】;
  • long——长整型【4字节】;
  • long long——更长的整型【8字节】;
  • float——单精度浮点型【4字节】;
  • double——双精度浮点型【8字节】;
  • bool——(C99)布尔;

计算机中内存单位:(比特:bit:0/1)<(字节:byte = 8 bit)< KB(1024) < MB(1024) < GB(1024) < TB(1024) < PB(1024);

PS:在这里int和long的大小一样并不是编译器出错,标准规定sizeof(long)>=sizeof(int),满足就行。

三、变量和常量

3.1 定义

#define SIZE 10  // define定义的标识符常量
int aaa = 10;  // 全局变量
enum SEX
{
//列出枚举变量的所有可能值,也叫枚举常量,不可修改,如women=4,会报错
women,  //printf("%d",women);结果为0
man,  //printf("%d",women);结果为1
secret  //printf("%d",women);结果为2
// 如想修改women的值,需要在初始的时候就修改
//women = 4;此时自动man = 5, secret = 6;
};
int main()
{
int bbb = 20;  // 局部变量,只在所在{}内有效,且{}运行结束会销毁
const int ccc = 30;  // 常变量,不可修改
// ccc具有常属性,但本质上还是变量,创建数组int arr[ccc]会报错,[]里面需要常量
2.54;  // 字面常量
3;  // 字面常量
'a';  // 字面常量
"dvv";  // 字面常量
return 0;
}

注意:1)如果‘aaa'和’bbb'使用了同一个名字,那么在{}内优先局部变量;

3.2 变量应用 - 加法

// 变量的应用,加法
#define _CRT_SECURE_NO_WARNINGS  // 此处为了防止scanf的使用报错
// 微软的编译器认为scanf函数不安全,建议使用scanf_s,但是scanf_s是VS特有的其它编译器不认识,不建议使用
int main()
{
num1 = 0;
num2 = 0;
scanf("%d %d", &num1, &num2);  // scanf函数用于从键盘读取数据,&是取地址符
// %d:整型;%c:字符型;%s:字符串;%f:浮点型(float);%lf:double类型;%p:地址类型;
num3 = num1 +num2;

return 0;
}

注意:还有一种一劳永逸的方法,在每个源文件前面都加上“#define _CRT_SECURE_NO_WARNINGS”,即修改VS安装路径中的“newC++file.cpp”(用记事本打开),在该文件最开始加上,那么之后新建的每个文件开头都会自动有;

3.3 同一项目两个文件的引用

// 文件1
int aaa = 10;
// 文件2
extern int aaa;  // 使用在同一项目别的文件中定义的变量需要声明
// aaa需要是全局变量
int main()
{
printf("%d",aaa);
return 0;
}

注意:1)#include<>一般包含标准库和头文件,一般不用它包含源文件,会出现多次重复定义/引用等一系列问题;2)如果不引用两个文件包含相同的全局变量名也会报错;

四、字符串+转义字符+注释

  • 字符:在键盘上敲出的任何都是字符,包括看得见的和看不见的空格;
  • 字符串就是一串字符
  • 字符串的结束标志是’\0‘,不算做字符串的内容
#include<stdio.h>
#include<string.h>
int main()
{
char ch[6] = {'a', 'b', 'c', 'd', 'e', 'f'};
char ch2[] = "abcdef";  // 此时ch2会比ch多占用一个字节的空间用来存储'\0'
printf("%s", ch);  // 此处没有结束标志,打印结果:abcdef+乱码
printf("%s", ch2);
// strlen 是求字符串长度的随机值
strlen(ch);  // 结果是大于6的随机值
strlen(ch2);  //  结果是6,‘\0’大小不算在内
return 0;
}

PS:观看系统内存可以通过‘调试—>窗口—>监视’

  • 转义字符类似于[抱拳抱拳]在聊天窗口会变成表情包一样,\n是换行,\t是tab;
  • 如果不想要换行而就是想要\n、\t的文本,那就需要\\n和\\t,就会识别成\n和\t;
转义字符列表
转义字符释义
\'用于表示字符常量‘
\"表示字符串内部双引号
\\表示一个反斜杠
\a警告字符,蜂鸣
\b退格符
\r回车
\v垂直制表符
\dddddd表示1~3个八进制数字,如'\130'——>'X'【ASCII码】
\xdddd表示1~2个十六进制数字,如'\x31'——>'1'【ASCII码】
  • 注释有两种方式,一种是C++系列的“//”这种比较好,嵌套的时候不会出问题;一种是C语言的”/**/“,这种在注释嵌套的时候可能会漏掉一部分;
  • 注释快捷键:注释:CTRL+K+C;取消注释:CTRL+K+U;

五、循环和判断语句

  • 循环语句:while(条件为真一直循环)、for、do while;
  • 判断语句:if、switch;

六、函数

为了减少重复代码,且方便统一修改,采用函数在不同的地方实现相同的功能;

int func(int x, int y)  //此处x,y是形参
{
复杂函数过程得到z
return z;
}
int main()
{
int a = 0;
int b = 0;
int ZZ = func(a, b);  //此处a,b是实参
return 0;
}

七、数组

数组是存储一组相同类型的数的容器;

int arr[20];  //整型数组,存放的都是int类型的数据
char arr2[2];  //字符数组
//数组可以用下标查看和修改,数组下标从0开始

八、操作符

8.1 算术操作符

+、-、*、/、%(取余,只适用于整型运算)

PS:其中除法分为整数除法和浮点数除法,整数除法得到的是整数的商,浮点数除法可以得到小数。浮点数除法只需要除数和被除数任一为浮点数就行;

注意:类似于7.0这样的小数,编译器会默认为是double类型,如果要定义为float类型需要自己加f;

8.2 移位操作符和位操作符

>>、<<    移位操作符:操作二进制位

&(按位与)、^(按位异或)、| (按位或)    位操作符:操作二进制位

8.3 赋值操作符

=、+=、-=、*=、/=、&=、^=、|=、>>=、<<=

例子:a = a + 5;等价于a += 5;

8.4 单目操作符

单目操作符的意思是只有一个操作数,即对一个数进行操作;

!(逻辑反操作)、-(负值)、+(正值)、&(取地址)、sizeof(如果对象是变量可以不用括号,如果是类型就一定需要括号)、(~(按位取反)、--、++、*(间接访问操作符)、(类型)类型强制转换操作符

8.5 关系操作符

==、!=、>、>=、<、<=

8.6 逻辑操作符

&&、||

8.7 条件操作符(三目操作符)

exp1 ? exp2 : exp3        exp1位真,执行exp2,exp1为假,执行exp3

8.8 逗号表达式

exp1,exp2,...,expn 逗号表达式是从左向右依次执行的,最后返回的是最后一个表达式的结果

8.9 下标引用、函数调用和结构体成员

[](下标引用)、()函数调用、结构体调用:.、->

九、常见关键字

auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register(建议把数据直接放在寄存器中)、return、short、signed(有符号的)、sizeof、static、struct、switch、typedef(类型重命名)、union、unsigned、void、volatile、while

  • 局部变量都是进入作用域创建,出了作用域自动销毁的,因此局部变量前面都应该有auto,只不过省略了;
void test()
{
static int a = 0;  // 如果这里没有static,程序运行结果会是十个0
// 有了static程序运行结果是1,2,3,4,5,6,7,8,9,10
//static变量在代码编译的时候就已经创建了,在程序运行的时候这一步没有了;
//static把变量存储在静态区,生命周期变为和全局变量一致,但还是只能在自己的作用域使用;
a++;
printf("%d", a);
}

int main()
{
int i = 0
while(i < 10)
{
test();
i++;
}
return 0;
}
//  如果static修饰全局变量,全局变量将会失去外部链接属性,只能在自己所在的源文件中使用;
//  static修饰函数和修饰全局变量类似,使得函数只能在自己所在的源文件中调用;

拓展:内存大概分为三个区域:1)栈区(临时作用的变量:局部变量、形参);2)堆区(动态内存分配:malloc、realloc、calloc、free);3)静态区(全局变量、静态变量);

拓展:一个解决方案里面可以建立多个项目,但一次只能运行一个,切换的时候需要右键点击->设为启动项目,就可以设置运行项目;

电脑上存储数据,速度排名:寄存器>缓存>内存>硬盘>网盘(越往上越贵,一般空间会更小)

十、#define定义常量和宏

定义常量在第三章有介绍

#define ADD(x, y) ((x) + (y))  // 注意没有;不然分号也会被识别替换到正文中
// 宏名(参数) 宏的实现体
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);  // 宏和函数非常的类似,但是和函数不同,它在编译的时候就替代了原来的代码
return 0;
}

十一、指针

在计算机上有物理的电线,电线的高低电平转化为数字信号就是1/0,32位的机器有32根电线,通过电线高低电平生成编号表示地址,管理内存。指针就是编号用来访问内存的,内存按照byte(字节)分配地址。

int main()
{
int a = 10;
printf("%p\n", &a);  //虽然a占四个字节,有四个地址,但取地址的时候取出来的是最小的地址;
// %p专门用来打印地址的,显示为16进制形式;
int* pa = &a;
// pa存放a的地址,是一个变量,指针变量;int表示它是int类型的指针,*表示它是指针变量
// 指针是编号本身,如果开辟空间存储编号,就是指针变量
* pa = 20;  //*是解引用操作符,通过pa里面的值找到它所指向的内容。*pa与a等价
// 此处修改a为20;
return 0;
}

ps:1)查看可以从“调试—>窗口—>内存/监视”里面看到内存情况;2)内存地址和地址中的内容展示形式一般为16进制;3)指针变量的大小取决于计算机的配置,32位4个字节,64位8个字节;

printf("%zd\n", sizeof(int*));  // 32位结果是4,64位结果是8;zd表示size_t的打印

十二、结构体

用来描述复杂对象,如:人、书籍等。

struct Stu  // 这里其实是自定义了一个名叫struct Stu的类型,并不占用内存
{
char name[10];
int age;
char sex[5];
}

int main()
{
struct Stu sss = {"偶偶", 20, "女"};
//这里把自定义类型实例化了,sss这个变量的类型是struct Stu
printf("%d\n", sss.age);  //用.操作符调用结构体中的变量
struct Stu* ps = &sss;
printf("%d\n", ps->age);  //用指针配合->访问结构体成员;
return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值