目录
C语言
函数
数据类型
变量
常量
字符串
转义字符
操作符
关键字
内存
指针
结构体
C语言
C语言:计算机编程语言,用于底层开发;是人和计算机交流的语言。
.c文件表示源文件;.h文件表示头文件;
C语言写出来的程序是.c文件,需经过编译器(编译、链接),生成可执行.exe文件;
函数
main函数
. 主函数;
. 程序的入口,C语言代码都是从main函数的第一行开始执行;
. 一个程序中,main函数有且只有一个;
代码展示:
int main()// int 表示返回整型
{
return 0;
}
int main(void)// void 表示main函数不接受参数
{
return 0;
}
int main(int argc, char* argv[]) // int argc, char* argv[] 表示指定参数
{
return 0;
}
int main(void)// void 表示main函数不接受参数
{
return 0;
}
printf输入库函数
. 库函数的使用必须包含头文件;
. printf库函数需要的头文件叫:stdio.h ;
代码展示:
#include
int main()// int 表示返回整型
{
printf("CSDN");// 双引号内是什么就输出什么
return 0;
}
scanf输入函数
* scanf("%d ", &变量名); // %d后面不能加 \n ;
. 使用scanf函数需要用到占位符 &(&变量名) ;
代码展示:
#define _CRT_SECURE_NO_WARNIN
#include
int main()// int 表示返回类型
{
int num = 0;// 定义变量;并且为变量赋了初始值
printf("请在键盘上输入一个数:");
scanf("%d", &num);// %d 表示打印一个十进制整数
return 0;// 表示返回的 0
}
. 在源文件的第一行需要定义宏:#define _CRT_SECURE_NO_WARNINGS
题目要求多组输入:使用 scanf 的返回值进行判断
. scanf 读取数的个数是几个,就返回几;
. 程序中,按 Ctrl + z 结束循环;但是在VS中需要输入三次 Ctrl + z;
代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int a = 0;
// 1
// scanf的返回值是:
// scanf读取成功
while (scanf("%d", &a) == 1)
{
//当scanf读取到一个数,则返回 1 ; 读取到几个数则返回几
//所以上面 scanf("%d", &a) 返回的是 1
//读取的
printf("scanf做判断语句\n");
int b = 0;
while (scanf("%d %d", &a, &b) == 2)
{
//scanf读取到两个数
// 2 == 2 为真,则执行 while 语句
printf("scanf读取到两个数");
}
}
// 2
// scanf读取失败
// 返回的是 EOF (EOF的值是-1)
while (scanf("%d", &a) != EOF)
{
// 如果scanf读取到一个数,则为 1
// 1 != EOF 为真,则执行 while 语句
printf("scanf做判断语句\n");
}
return 0;
}
数据类型
. 目的:数据类型是用来创建变量的
. 计算机中的单位:bit - 比特位 ;byte - 字节 (1byte = 8bit) ;KB (1KB = 1024byte) ;
MB (1MB = 1024KB) ;GB ;TB ;PB ......
数据类型 | 长度/(字节) | 打印方式 | ||
字符型 | char | 1 | %c | |
整型 | short | 2 | %hd | |
int | 4 | %d | ||
long | 4 | %ld | ||
long long | 8 | %lld | ||
浮点数 | 单精度浮点数 | float | 4 | %f |
双精度浮点数 | double | 8 | %lf |
代码展示:
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int a;
float b;
double c;
char d;
printf("请输入:");
scanf("%d", &a);// %d输出整型
scanf("%f %lf", &b, &c);// 输出浮点数
scanf("%c", &d);// %c输出字符型;%s输出字符串(在C语言中没有字符串类型)
return 0;
}
代码展示:
#include
int main()
{
printf("%d\n", sizeof(char));// \n表示换行的意思
printf("%d\n", sizeof(short));// sizeof计算大小
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
return 0;
}
变量
. 变量定义:数据类型 变量名;
代码展示:
int main()
{
int a;//定义变量
char ch = 'c';//定义变量并赋与了初始值
return 0;
}
. 变量分类:全局变量、局部变量
1. 由{}区分:在{}内的叫局部变量;在{}外的叫全局变量;
2. 局部全局都可以使用的时候,局部优先;
代码展示:
#include
int num = 20;// 全局变量
int main()
{
int num = 10;// 局部变量
printf("%d\n", num);// 输出的是局部变量10
return 0;
}
变量作用域(范围):
. 全局变量作用域:整个 工程中使用都有效
. 局部变量作用域:在定义局部变量之后的局部范围内都有效
变量生命周期(时间):
. 全局变量生命周期:整个程序的生命周期
. 局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束
代码展示:
#include
int a = 1;
int main()
{
int a = 2;
int b = 110;
{
int b = 120;
printf("%d\n", a);//就近原则,输出2
}
printf("%d\n", b);//出了 b = 120 所在的作用域,则 b = 120 的生命周期结束;此处输出110
printf("%d\n", a);// a = 2 还在局部范围内,则 a = 2 的生命周期还未结束;就近原则,此处输出2
return 0;
}
常量
. const修饰的常变量
1. const就是常属性的意思,修饰变量;
2. 被const修饰的值不能被改变;
3. 常量的属性,本质还是变量;
代码展示:
#include
int main()
{
const int a = 10;//a 就是const修饰的常变量,但是本质上a还是变量
// int arr[a] = {0};//定义的是整型数组,所以[]内必须是整型常量;因为 a 本质还是变量,所以不能写 a;
return 0;
}
. define定义的标识符常量
1. #define 常量名 值;
代码展示:
#include
#define M 10
int main()
{
int arr[M] = { 0 };//说明 M 是一个整型常量
return 0;
}
. 枚举常量
1. 由关键字enum定义;
2. enum name{枚举常量名1,枚举常量名2,...};
3. 输出的值是默认的,依次从 0, 1, 2...;
4.改变默认值可以通过对枚举常量名1进行赋值(枚举常量名1 = 值);
代码展示:
#include
enum Gender
{
female = 5,
male,
secrecy,
};
int main()
{
enum Gender f = female;
enum Gender fm = male;
printf("f = %d\n", f);//输出值为5
printf("fm = %d\n", fm);//输出值为6
return 0;
}
. 字面常量
1. 直接定义的常量就叫字面常量,例如:10;100;20;.... ;
字符串
* 字符串是在双引号内部的;在单引号内部的叫字符 *
. 字符串的结束标志是 \0 ,但 \0 不作为字符串
. 计算字符串长度是计算 \0 之前的字符串长度,不包括 \0
. 计算字符串长度使用 strlen 库函数,需要调用头文件 string.h
代码展示:
#include
#include
int main()
{
char arr[] = "adcd";// 在d的后面隐藏了 \0
char arr_1[] = { 'a','b','c','d' };
printf("arr:%s\n", arr);
printf("字符串arr的长度为:%d\n", strlen(arr));
printf("arr_1:%s\n", arr_1);
printf("字符串arr_1的长度为:%d\n", strlen(arr_1));// 随机值,找到 \0 才会停
return 0;
}
转义字符
转义字符 | 释义 |
\ddd | ddd表示1~3个八进制数 |
\xdd | dd表示2个十六进制数 |
\\ | 表示一个反斜杠 \ |
\' | 表示一个单引号 ' |
\" | 表示一个双引号 " |
\t | 表示键盘上的 tab键 |
\n | 表示换行 |
\r | 表示回车 |
\b | 表示向后退一格 |
\a | 警告字符,蜂鸣 |
操作符
* 在C语言中:0 表示假,非0 表示真 ;
/ (得商) | 1: 除号两端都是整数,执行整数除法,不会得到小数; 2: 打印用 %lf ,保证除号两端至少有一个小数(默认是double类型),得到的就是一个小数; 3: (%.2lf 表示只保留两位小数位) |
% (取模) | 得到是余数; |
逻辑操作符 | && -- 并且 (有一假,则为假); || -- 或者 (有一真,则为真); |
三目操作符 | 表达式1 ?表达式2 :表达式3(表示式1成立执行表达式2;不成立执行表达式3) |
逗号表达式 | 从左向右依次计算,最后一个表达式的结果是整个表达式的结果; |
关键字
关键字:不能自己创建的关键字 ;
类型 | char ; double ; enum ; float ; int ; long ; short ; sizeof ;struct ; void ; auto(自动)所有局部变量都是auto类型 ;signed(有符号的) ; unsigned(无符号的) ; typedef(重定义) ; union(联合体); |
循环类型 | break ;continue ;do while ; while ; for |
分支类型 | switch ; break ; case ; default ; if ; else ; go to(跳转) |
存储类型 | extern(声明外部符号) ; register(寄存器关键字) ; static(静态的) |
函数类型 | return |
不常用 | volatile(易变的) |
. typedef:是类型名重定义,将复杂的类型简单化
代码展示:
#include
typedef unsigned char unchar;//将 unsigned char 重新定义为 unchar
int main()
{
unsigned char ch = 'a';
printf("%c\n", ch);
unchar ch_1 = 'A';//uncahr 也表示 unsigned char(无符号字符型)
printf("%c\n", ch_1);
return 0;
}
. static:1. 修饰局部变量 2. 修饰全局变量 3. 修饰函数 (被static修饰的变量是没有对应的汇编代码的。)
1. static修饰局部变量,作用域依旧在局部作用域内,但生命周期变长了;
1. 局部变量被static修饰之后,进入函数时已经创建好了,出函数时也不销毁,多次调用时,共享变量;
1. 普通的局部变量是放在栈区上的,被static修饰的后,存放在内存的静态区,静态区的变量生命周期和全局变量生命周期一样;
代码展示:
#include
void test_1()
{
static int i = 1;//static使得i的值没有被销毁
i++;
printf("%d ", i);//输出 2 3 4 5 6
}
int main3()
{
int j = 0;
while (j < 5)
{
test_1();
j += 1;
}
}
void test()
{
int i = 1;//局部变量
i++;
printf("%d ", i);//输出 2 2 2 2 2
}
int mian2()
{
int j = 0;
while (j < 5)
{
test();
j = j + 1;
}
return 0;
}
2. static 修饰全局变量,将外部链接属性变成了内部链接属性;全局变量只能在当前.c文件中使用;改变了作用域,但生命周期没变;
3. static修饰函数,将外部链接属性变成了内部链接属性;
. extern:声明来自外部文件的符号
内存
在语言层面上,内存主要分为:栈区、堆区、静态区;
. 栈区: 局部变量放在栈区;函数的形式参数;为具有临时属性的变量开辟的;
. 堆区:为动态内存开辟和管理的;
. 静态区:全局变量;静态变量;
指针
. 内存:给每个内存进行编号 -- 编号叫做地址;
1. 把内存划分为一个个有效的内存单元(一个单元是一个字节);
2. 给每个内存单元进行编号(编号 == 地址 == 指针),C语言中把地址也叫指针;
3. 一个地址管理一个字节;
. 指针变量:存放地址的变量;
. 指针变量的大小是固定不变的,(x86下编译是4个字节,x64下编译是8个字节)
代码展示:
#include
int main()
{
int a = 10;
int* pa = &a;//pa叫指针变量
// * 说明pa是指针变量
// int 说明pa指向的是int类型的变量
//*pa就等价于a
return 0;
return 0;
}
代码展示:
#include
int main()
{
char* pc;
short* ps;
int* pi;
double* pd;
printf("%zd\n", sizeof(pc));//格式字符串的打印使用"%zd"
printf("%zd\n", sizeof(ps));
printf("%zd\n", sizeof(pi));
printf("%zd\n", sizeof(pd));
return 0;
}
结构体
. 结构体:用来描述复杂类型的
代码展示:
//结构体struct
struct Stu
{
char name[20];
int age;
float score;
};
int main()
{
struct Stu s1 = { "girl", 18, 90 };//相当于int num = 0;
struct Stu s2 = { "girl_1", 19, 95 };
struct Stu s3 = { "girl_2", 20, 100 };
printf("%s %d %f\n", s1.name, s1.age, s1.score);
struct Stu* ps1 = &s1;//ps1的类型由s1决定
printf("%s %d %f\n", ps1->name, ps1->age, ps1->score);
return 0;
}
文章有许多不足处,希望大家能够在评论区指出!
————————————————
版权声明:本文为CSDN博主「我叫小白菜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2201_75406088/article/details/131152462