目录
因为以后工作关系,要接触C语言,想再系统的学习一下。我看的是B站鹏哥的课《C语言从入门到精通》,讲的真的很细致,非常适合没接触过任何语言的初学者学习,让人第一次接触不至于那么懵。准备用这个专栏记录一下学习笔记,第一节鹏哥大致介绍了学习C语言入门所有要学习的东西。
一、数据类型
数据类型是用来创建变量的
类型 | 描述 | 占空间大小(字节) |
char | 字符数据类型 | 1 |
short | 短整型 | 2 |
int | 整型 | 4 |
long | 长整型 | 4 |
long long | 更长的整型 | 8 |
float | 单精度浮点数 | 4 |
double | 双精度浮点数 | 8 |
补充:
●%d:打印一个整型
printf("%d",age) printf("avg=%d\n",avg)
●%f:打印一个float型浮点数
●%lf:打印一个double型浮点数
printf("%lf",weight)
●%s:打印一个字符串
printf("%s",arr1)
●%p:打印一个地址
●\n:换行
●sizeof():关键字/操作符,用来计算类型或变量所占空间的大小,单位为字节
●1个bit(比特)位存放一个二进制位
●一个byte(字节)=8个比特位
●1kb=1024byte
●1mb=1024kb
●1gb=1024mb
二、变量、常量
1、定义变量的方法
字符型:char ch='a';
整型:int age=10;
短整型:short num=10;
单精度浮点型:float weight=50.5;
2、变量的分类
分类 | 区分 | 作用域 | 生命周期 |
全局变量 | {}内部定义的 | 整个工程 | 整个程序的生命周期 |
局部变量 | {}外部定义的 | 变量所在局部范围 | 进入作用域生命周期开始, 出作用域生命周期开始 |
变量的生命周期:指的是变量的创建到变量的销毁之间的一个时间段
当局部变量和全局变量名字冲突时,局部变量优先。并且不建议把局部变量和全局变量的名字设置成一样。
补充:
scanf()函数:用于取用户的输入
如:
scanf("%d %d",&a,&b) //报错
解决办法:
(1)在源文件第一行加上:#define _CRT_SECURE_NO_WARNINGS 1
(2)在Data(D:)>Program Files(x86)>Microsoft Visual Studio 12.0>VC>vcprojectitems>newc++file.cpp文件里将#define _CRT_SECURE_NO_WARNINGS 1编辑进去,以后的编写都会自动在源文件第一行加上这句话就不会报错了
3、常量
(1)字面常量
例:
int main()
{
3.14;
10;
'a';
"rjreb";
}
//没啥意义
(2)const修饰的常变量
const修饰的常变量,具有常属性(即不能被改变的属性),本质上还是变量。
例:
const int n=10;
int arr[n]={0}; //报错
(3)#define定义的标识符变量
#define定义的标识符变量不可修改,语法实例:#define MAX=1000
(4)枚举常量
枚举常量即可以一一列举的常量。
例:
enum Sex
{
MALE,
FEMALE,
SECRET
}
int main()
{
enum Sex s=MALE;
return 0;
}
//还可以给枚举常量赋初值
enum Sex
{
MALE=3,
FEMALE,
SECRET
}
int main()
{
enum Sex s=MALE; //此时MALE等于3
return 0;
}
三、字符串、转义字符、注释
1、字符串
"hello bit.\n"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。字符串的结束标志是一个\0的转义字符,不算做字符串的内容。
\0是结束标志的验证方法:
(1)在【监视】中查看内存情况
(2)打印字符串
char arr1[]="abc";
char arr2[]={'a','b','c'};
printf("%s\n",arr1); //abc
printf("%s\n",arr2); //abcewkghwiuefbj
(3)求字符串长度
char arr1[]="abc";
char arr2[]={'a','b','c'}
printf("%d\n",strlen(arr1)); //3
printf("%d\n",strlen(arr2)); //15
2、转义字符
引例:假如我们要在屏幕上打印一个目录:c:\code\test.c
#include<stdio.h>
int main()
{
printf("c:\code\test.c\n");
return 0;
}
//输出为c: est est.c
因为计算机以为\t是转义字符
常见转义字符有:
转义字符 | 释义 |
\? | 在书写连续多个问号时使用,防止它们被解析成三字母词 |
\. | 用于表示字符常量' |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1-3个八进制的数字。如:\130为130对应的ASCII码,即X。 |
\xddd | dd表示2个十六进制数字。如:\x30为0 |
3、注释
//是C++的注释符
/**/是C语言的注释符,不支持嵌套注释
四、选择语句
例:
#include<stdio.h>
int main()
{
int coding=0;
printf("你会努力学习吗?(选择1或0):");
scanf("%d",&coding);
if(coding==1)
{
printf("坚持,你会成功的!\n");
}
else
{
printf("放弃,回家放牛吧。\n");
}
return 0;
}
五、循环语句
循环语句有while、for、do...while...。
例:
int main()
{
int line=0;
while(line<30000)
{
printf("写代码:%d\n",line);
line++;
}
if(line==30000)
{
printf("好工作\n");
}
return 0;
}
六、函数
例:
#include<stdio.h>
int main()
{
int num1=0;
int num2=0;
int sum=0;
printf("输入两个操作数:>");
scanf("%d%d",&a,&b);
sum=num1+num2;
printf("sum=%d\n",sum);
return 0;
}
//可以将上述代码用函数实现,如下:
int Add(int x,int y)
{
int num1=0;
int num2=0;
scanf("%d%d",&num1,&num2);
int sum=Add(num1,num2);
printf("%d\n",sum);
}
七、数组
数组:一组相同类型元素的集合
定义方法:int arr[10]={1,2,3,4,5,6,7,8,9}; //定义一个整型数组,最多放10个元素
访问方法:用数组下标来访问
补充:
char ch[5]={'a','b','c'}; //不完全初始化,剩余的默认为0。
八、操作符
算术运算符
+ - * / %
移位运算符
>> <<
位操作符
&按位与 |按位或 ^按位异或
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
! | 逻辑操作符 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(单位为字节) |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
关系操作符
> >= < <= != ==
逻辑操作符
&& ||
条件操作符(三目操作符)
exp1?exp2:exp3
逗号操作符
exp1,exp2,exp3,...,expN
逗号表达式从左向右计算,整个表达式的结果是最后一个表达式的结果
下标引用、函数调用和结构成员
[] () . ->
九、常见关键字
●C语言提供的,不能自己创建关键字
●关键字不能做变量名
●常见关键字:
auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、long、int、register、return、short、signed、sizeof、static、struct、switch、typedef、union、unsigned、void、volatile、while
●部分简单解释:
auto:是自动的,修饰局部变量,只是省略掉了
extern:用来声明外部符号
register:寄存器关键字,针对大量/频繁被使用的数据
static:静态的
union:联合体
volatile:C语言暂时不讲
●define、include:不是关键字,是预处理指令
1、typedef关键字
用来类型重定义
typedef unsigned int u_int; //进行重定义
int main(){
unsigned int num1=100; //(1)
u_int num2=100; //(2)
}
//(1)和(2)完全一致
2、关键字static
用来修饰变量和函数:
●修饰局部变量->静态局部变量:改变生命周期,使变量不销毁。本质上改变了存储类型。
●修饰全局变量->静态全局变量:使得全局变量只能在自己所在源文件(.c)内部可以使用。本质上是因为全局变量具有外部链接属性,但是被static修饰后就变成了内部链接属性。
●修饰函数->静态函数:使得函数只能在自己所在源文件(.c)内部可以使用。本质上是因为函数具有外部链接属性,但是被static修饰后就变成了内部链接属性。
存储类型 | 存放的内容 |
栈区 | 局部变量、函数的参数 |
堆区 | 用于动态内存分配 |
静态区 | 全局变量、static修饰的静态变量 |
十、define定义常量和宏
define是一个预处理指令
1、define定义符号
2、define定义宏
例:
//例1
#define ADD(X,Y) X+Y
int main()
{
printf("%d\n",ADD(2,3)); //输出5
return 0;
}
//例2
#define ADD(X,Y) X+Y
int main()
{
printf("%d\n",4*ADD(2,3)); //输出11,因为宏完成的是替换,这里实际为4*2+3
return 0;
}
//例3
#define ADD(X,Y) ((X)+(Y))
int main()
{
printf("%d\n",4*ADD(2,3)); //输出20
return 0;
}
十一、指针
指针就是地址
int a=10; int* pa=&a; *pa=20; //此时a=20
&为取地址操作符, *说明pa是指针类型,int说明pa执行的对象是int类型的,用来存放a的地址
1、指针的大小
int main()
{
printf("%d\n",sizeof(char*)); //4
printf("%d\n",sizeof(short*)); //4
printf("%d\n",sizeof(int*)); //4
printf("%d\n",sizeof(long*)); //4
printf("%d\n",sizeof(long long*));//4
printf("%d\n",sizeof(float*)); //4
printf("%d\n",sizeof(double*)); //4
}
结论:
指针大小在32位平台是4个字节,64位平台是8个字节。
十二、结构体
结构体使得C语言有能力描述复杂类型。比如描述学生,学生包含:名字+年龄+性别+学号这几项信息,这里只能用结构体来体现了。
//创建一个学生的类型
struct Stu
{
char name[20];
int age;
char sex[5];
char id[15];
}
//创建一个书的类型
struct Book
{
char name[20];
float price;
char id[30];
}
int main()
{
struct Stu s={"张三",20,"男","12"}; //结构体的创建和初始化
printf("1:%s %d %s %s\n",s.name,s.age,s.sex,s.id); //结构体变量.成员变量名
struct Stu * ps=&s;
printf("2:%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).id);
printf("3:%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id); //结构体指针->成员变量名
return 0;
}
1、结构体的初始化