1.什么是c语言
c语言是一门计算机语言(计算机语言是什么呢? 人与计算机交流的语言 还有C/C++/JAVA//python)
2.第一个代码
1.创建工程(新建项目C++空项目)
2.添加源文件(视图-解决方案管理器)
.c - 源文件
.h - 头文件head
#include<stdio.h>
int main()//主函数-程序的入口-main函数仅有一个
{
printf("hello wold\n");
printf("hehe\n");函数-print function-printf-打印函数
return 0;//返回0
}
3.数据类型
%d - 打印整型
%c - 打印字符
%f - 打印浮点数字-打小数
%p - 以地址的形式打印
%x - 打印16进制数字
char //字符数据类型 (用来向内存申请空间,用来存放)
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点型
double //双精度浮点型
//c语言有没有字符串类型?
- 为什么出现这么多类型?
- 每种类型的大小是多少?
sizeof计算 向内存申请的空间内存 单位:字节
//计算机中常见的单位
//bit - 比特位(存一个二进制位1/0)
//byte - 字节(1byte=8bit) 一个字节=8个比特位
//kb(1kb=1024byte)
//mb(1mb=1024kb)
//gb(1gb=1024mb)
//tb(1tb=1024gb)
//pb(1pb=1024tb)
注意:存在那么多的类型,其实是为了更加丰富的表达生活中的各种值
类型使用
char ch='w';
int weight=120;
int salary=20000;
4.1变量,常量
定义变量的方法
int age=150;
float weight=45.5f;
char ch='w';
4.2变量的分类
- 局部变量
- 全局变量
#include<stdio.h>
int one = 2023;//全局变量
int main()
{
int two = 2022;//局部变量
//下面定义的one会不会遇到问题??
int one = 2021;//局部变量
printf("global=%d\n", global);
return 0;
}
总结:上面的局部变量one变量的定义其实没什么问题!
当局部变量和全局变量同名时候,局部变量优先使用。 (建议局部和全局不要相同,容易产生bug)
4.3变量的使用
#include<stdio.h>
int main()
{
//计算两个数的和
int one = 0;
int two = 0;
//输入语句
scanf_s("%d%d", &one,& two);//‘&’取地址符号(好比输入你的身份证号找到你的人)
int sum = 0;
sum = one + two;
//输出语句
printf("sum=%d", sum);
return 0;
}
4.4变量的作用域和生命周期
作用域
作用域(scope),程序设计概念,通常来说,一段程序代码在所用带的名字并不总是有效/可用的
而限定这个名字的可用性的代码就是这个名字的作用域(这个变量哪里可以用,哪里就是它的作用域(局部和全局))
- 局部变量的作用域是变量所在的局部变量范围。
- 全局变量的作用域是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
4.5常量
c语言中的常量和变量的定义的形式有所差异。
c语言中的常量分为以下几种
- 字面常量 3;
- const修饰的常变量(const-常属性 ,const修饰的常变量).
- #define定义的标识符常量
- 枚举常量 (enum)
#include<stdio.>
int main()
{ 3;
99999;//字面常量
}
#include<stdio.>
int main()
{ const int a=10;//这里的a是const修饰的常变量
a=1000;//且a不能修改(上手你就知道了)
printf("%d",a)
return 0;}
#include<stdio.>
#define MAX 10//#define的标识符常量
int main()
{ int arr[MAX]={0};
printf("%d",MAX);
return 0;}
#include<stdio.>
int main()
enum color
{
RED,
YELLOW,
BLUE};//RED,YELLOW,BLUE是枚举常量
{ enum color color=BLUE;
return 0;
}
5.1字符串+转义字符+注释
字符串
“hello world" ”abcdefg“ ” “//空字符串
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算字符串的内容。
#include<stdio.h>
int main()
{
char arr1[] = "abc";//数组
char arr2[] = { 'a','b','c' };
char arr3[] = { 'a','b','c','\0'};//'\0'字符串的结束标志
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
ASCII编码
数据在计算机上存储的时候,存储的是二进制
ASCII编码,字符对应的值叫ASCII码值
2.转义字符
转变意思(在这里输入的 c:\test\32\test.c, 输出却是别的样子)
则要了解一下这个东西了:转义字符
#include<string.h>
#include<stdio.h>
int main()
{
printf("%d\n", strlen("c:\test\32\test.c"));
//c : \t est \32 \t e s t .c 结果13
//\32 32是2个8进制数字
//32作为8进制代表的那个十进制数字,作为ASCII码值,对应的字符
//32-->10进制26-->作为ASCII码值代表的字符
return 0;
}
3.注释:
1.代码在有不需要的代码可以删除,也可以注释掉
2代码在有些代码比较难懂,可以加一下注释文章
比如:
#include<string.h>
#include<stdio.h>
int main()
{
printf("%d\n", strlen("c:\test\32\test.c"));
/*c : \t est \32 \t e s t .c 结果13*/
/*\32 32是2个8进制数字*/
//32作为8进制代表的那个十进制数字,作为ASCII码值,对应的字符
//32-->10进制26-->作为ASCII码值代表的字符
return 0;
}
注释有两种风格:
- c语言风格的注释/*xxxxx*/
- 缺陷:不能嵌套
- c++风格的注释//Xxxxxxx
- 可以注释一行也可以注释多行
6.1选择语句
#include<stdio.h>
int main()
{
int input = 0;
printf("好好学习\n");
printf("你要好好学习吗?(1/0)\n");
scanf_s("%d", &input);
if (input == 1)
printf("考个好成绩\n");
else
printf("不及格\n");
return 0;
}
结果
6.2循环语句
c语言中然后实现循环呢?
- while语句
- for语句
- do...while语句
//while循环
#include<stdio.h>
int main()
{
int line = 0;
printf("好好敲代码\n");
while (line <=20000)//20000行代码
{
printf("敲代码%d\n",line);
line++;
}
if (line>20000)
printf("好工作\n");
return 0;
}
//for循环
#include<stdio.h>
int main()
{
int line = 0;
printf("好好敲代码\n");
for (int line = 0; line <= 20000; line++)
{
printf("敲代码%d\n", line);
}
if (line>20000);
printf("好工作\n");
return 0;
}
#include<stdio.h>
int main()
{
printf("好好敲代码\n");
int line = 0;
do
{
line++;
printf("敲代码%d\n", line);
}
while(line <= 20000);
if(line 20000);
printf("好工作\n");
return 0;
}
7函数
特点:简化代码(代码重复)
#include <stdio.h>//库函数
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf_s("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
上述代码,写成函数如下://自定义函数
#include <stdio.h>
int Add(int x, int y)
{
int z = x+y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf_s("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
结果
8.数组
要储存1-10的数字,怎么储存?
c语言中给了数组的定义:一组相同类型元素的集合
数组可以通过下标来访问:
数组定义
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个整型数组,最多放10个元素
数组的使用
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//定义一个整型数组,最多放10个元素
// char ch[20];
//float arr[5];
int i = 0;
while (i<10)
{
printf("%d\n", arr[i]);
i++;
}
return 0;
}
9.操作符
算数操作符:+ - * / %
移位操作符: >> <<
位操作符:& ^ |
赋值操作符:= += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1, exp2, exp3, …expN
下标引用,函数调用和结构成员
[] () . ->
常见关键字
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
C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造的关键字的
10关键字 typedef
typedef顾名思义是类型定义,这里应该理解为类型重命名(改名卡)
比如:
//将unsigned int 重命名uint_1,所以uint_32也是一个类型名
typedef unsigned int uint_1;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1=0;
uint_1 num2=0;
return 0;
}
10.2关键字static
在C语言中:
static是用来修饰变量和函数的
1.修饰局部变量-静态局部变量
2.修饰全局变量-静态全局变量
3.修饰函数-静态函数
10.3.1修饰局部变量
#include<stdio.h>//代码1
void test()
{
int i=0;
i++;
printf("%d",i);
}
int main()
{
int i=0;
for(i=0;i<10;i++)
{
test();
}
return 0;
}
运算结果
#include<stdio.h>//代码2
void test()
{
static int i = 0;
i++;
printf("%d", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
运算结果
结论:static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
10.3.2修饰全局变量
//代码1
#include<stdio.h>
//add.c
int g_val = 2023;
//test.c
extern int g_val = 2023;
int main()
{
printf("%d\n", g_val);
return 0;
}
//代码2
#include<stdio.h>
//add.c
static int g_val = 2023;
//test.c
extern static int g_val = 2023;
int main()
{
printf("%d\n", g_val);
return 0;
}
结论:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他文件使用。
10.3.3修饰函数
//代码1
#include<stdio.h>
//add.c
int Add(int x, int y)
{
return x+y;
}
//test.c
extern int Add(int x, int y)
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
//代码2
#include<stdio.h>
//add.c
static int Add(int x, int y)
{
return x+y;
}
//test.c
extern static int Add(int x, int y)
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
11#define定义常量和宏(简单了解即可)
#include<stdio.h>
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
12指针
1.内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是 1 个节 。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元地址 。
//变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是地址的。
//取变量地址如下:
#include<stdio.h>
int main()
{
int a=10;
&a;//取出a的地址
//这里a是4个字节,每个字节都有地址,取出的第一个字节地址(较小的地址)
printf("%d\n",a)//打印地址,%p是以地址的形式打印
return 0;
}
//地址如何存储,需要定义指针变量
int a=10;
int*p;//p为一个整形指针变量
p=&a;
指针的使用实例
#include<stdio.h>
int main()
{
int a=10;
int*p=&a;
*p=20;
return 0;
}
12.2指针变量的大小
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}
13.结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。这里只能使用结构体来描述了。
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
#include <stdio.h>
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
int main()
{
//打印结构体信息
struct Stu s = { "张三", 20, "男", "20180101" };
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符
struct Stu* ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps -> id);
return 0;
}