一、零零碎碎的知识
(一)知识
1.字符串的结束标志
由双引号引起来的一串字符成为字符串字面值
字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算做字符串内容。
2.scanf的返回值
scanf返回的是读取到的数据的个数,如果scanf函数读取失败会反馈EOF, end of file 文件结束标志,本质是-1,即#define EOF -1【#define 定义的标识符常量】. 比如:
int main(){
int iq=0;
int eq=0;
//输入
int n =scanf("%d %d",&iq,&eq);
printf("%d/n",n);
return 0;
}
//此时输入 123 156 按下回车键后
//输出的是 2
如何应用呢?——实现多组输入的判断:如果iq大于140则判断为天才。输入一个数据后,不会结束程序,可以再次输入判断。
int main(){
int iq=0;
int eq=0;
//输入
while (scanf("%d",&iq)==1) //读取到a只有0
{
if (iq>=140)
printf("Genius\n");
}
return 0;
}
//ctrl+z 结束
print返回值是字符个数
3.extern
声明外部符号,使得全局变量、函数(函数具有外部链接属性)可以在不同的源文件上面使用。
4. 软件操作
监视窗口:F10调试,一步一步走,遇到函数进入函数按F11
一个接近方案里面可以创建多个项目,项目之间不能互相调用,但是项目内部的源文件之间可以。
5.数字类型
int可以表示-21亿~21亿:%d,%02d,输出两位
long long更长的整数:%lld
double:%.2lf(两位数的小数)
float:%.2f
5. 操作符~
对于:
#include <stdio.h>
int main{
if (18<=age<=30) //错误 应该写age>=18&&age<=30
printf("青少年\n");
return 0;
}
输入16,会输出青少年,因为18<=16会输出0,0<=30成立,所以print。
6.rand()函数如何生成随机数;
C语言:生成随机数(并非固定的随机数)——rand()、srand()_随机数字程序代码-CSDN博客
(二)作业
1.多组输入——判断三角形
int main()
{
int a = 0;
int b = 0;
int c = 0;
while (scanf("%d %d %d", &a, &b, &c) == 3)//实现多组
{
//判断三角形
if (a + b > c && a + c > b && b + c > a)
{
//等边三角形
if (a == b && b == c)
{
printf("Equilateral triangle!\n");
}
else if ((a == b && a != c) || (a == c && a != b) || (b == c && b != a))
{
printf("Isosceles triangle!\n");
}
else
{
printf("Ordinary triangle!\n");
}
}
else
{
printf("Not a triangle!\n");
}
}
二、初始C语言
12.常见关键字
自定义类型:enum
修饰变量:auto(自动 修饰局部变量)
函数的返回:return,
修饰类型:const,signed,unsigned(无符号的,正数:身高等)
计算变量
void-函数的返回值/函数的参数/修饰指针
#define #include,都是预处理指令,不是关键字
12.1 typedef
给复杂的类型命名
typedef unsigned int u_int;
typedef unsigned long long ull;
int main()
{
unsigned int num = 0;
u_int num2 = 0;
ull num3 = 0;
return 0;
}
12.2 关键字static
1.修饰局部变量
本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了
static 修饰局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束,但是作用域不变(还是函数内部,依然是局部变量,和全局变量不一样)
void test()
//void 指函数返回值未空,所以不需要return
{
static int a = 5;//静态变量的
//如果是int a=5(没有static),打印10次6,局部变量会销毁
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
C/C++代码学习中,把内存划分为3个区域
- 栈区(临时作用的变量都是在栈区):局部变量,形式参数。特点:进入作用域创建,出去作用域销毁(还给操作系统)。
- 堆区:动态内存分配
- 静态区:全局变量、静态变量。特点:创建好后,直到程序结束才销毁(还给操作系统)。
2.修饰全局变量
全局变量具有外部链接属性,所以在其他源文件内部依然可以使用(方法要正确)
但是static修饰全局变量,改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性。
这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了。(感觉像是作用域变小了)
//声明外部符号
extern int g_val;
//在另一个源文件中定义 int g_val=2023
//若定义 static int g_val=2023,则print不出来
int main()
{
printf("%d\n", g_val);
return 0;
}
3.static修饰函数
static 修饰函数和static修饰全局变量是一样的,函数是具有外部链接属性的(在另一个源文件应用时需要用extern声明外部符号),但是被static修饰,就变成了内部链接属性,使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用的
12.3 关键字register(寄存器)
Q电脑上产生的数据都是放在哪里的呢?
- 寄存器:字节-几十个
- 高级缓存:几十个MB
- 内存:8G/16G/32G
- 硬盘:500G,1T
- 网盘:2T
寄存器的速度是最快的,从下往上:速度变快,造价变高。寄存器和内存完全没有关系
register int a=10.指的是建议把变量放到寄存器。
int main()
{
//register 仅仅是建议的作用
//建议放在寄存器中,但是不是真的放在寄存器中,取决于编译器
register int num = 10;
return 0;
}
13.#define 定义常量和宏
定义常量
#define M 100
int main()
{
int arr[M] = {0};//100*4 = 400
int m = M;
printf("%d\n", sizeof(arr));
//400,数组有100个元素,每个元素是int类型,有四个字节。
printf("%d\n", M);
printf("%d\n", m);
return 0;
}
定义宏
//宏
#define ADD(x, y) ((x)+(y))
// 参数 宏的实现体
//函数
int Add(int x, int y)
//返回类型 函数名(函数参数)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);
printf("%d\n", c);
int d = Add(a, b);
printf("%d\n", d);
return 0;
}
14 指针
14.1 内存
指针是用来访问内存的。
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
- a一个内存单元多大比较合适?——一个字节
- C语言中 char--1Byte;short--2Byte;int--4Byte(一个空间内4个编号可以管理)
- b地址怎么编号?【内存单元编号=地址=指针】
- 计算机:有地址线。线上有物理的电线,产生高低电平的信号,转化为1/0的数字信号。32位机器,上面有32根地址线,可以产生个地址,可以管理个字节=4G的内存空间
程序运行起来,要加载到内存中,也要申请内存空间使用
14.2 指针
指针 - 地址 -编号
指针变量 - 变量 - 存放地址的变量
口头语中说的指针,基本上都是指针变量
- int *pa=&a;把a的地址存放到pa中,int* 是pa变量的类型,int表明整型 *表明是指针
- pa(0x0012ff40):存放a的地址的,是一个变量,叫:指针变量,意思是存放指针的变量
- *pa(30):解引用操作符,*pa 就是a。加*就是找东西,找该地址的东西
//%p - 专门用来打印地址的,是16进制的形式表示地址的
int main()
{
int a = 15;//虽然a占有4个字节,但是当我们&a的时候,拿到的是4个字节中第一个字节的地址
printf("%p\n", &a);//p前面加个ox就是16进制
int * pa = &a;//pa存放a的地址的,是一个变量,叫:指针变量,意思是存放指针的变量
*pa = 30;//pa里面存的是地址,加*是找东西:解引用操作符,*pa 就是a
printf("%d\n", a);
return 0;
}
指针变量的大小:(指针式用来存放地址的)
32 位机器:地址32个二进制位,存储需要4个字节。指针变量达标为4个字节。
64 位机器:地址64个二进制位,存储需要8个字节。指针变量达标为8个字节。
15 结构体
C语言中引用结构体描述复杂对象,结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。
结构体{ }
//学生(创造了学生类型stu)
struct Stu
{
//学生的相关属性
char name[20];//名字-字符串(字符串放到字符的数组),一个汉字是2个字符的
int age;//年龄
char sex[5];//“男”、“女”、“保密”。保密4个,加一个/0=5个
};
struct Book
{
char name[20];
char author[10];
float price;
};
int main()
{
struct Stu s1 = { "张三", 20, "男" };
struct Stu s2 = {"李四", 20, "男"};
struct Stu s3 = {"王五", 20, "男"};
struct Stu s4 = {"翠花", 20, "男"};
struct Book b = { "《鹏哥C语言》", "鹏哥", 66.6f };
printf("%s %s %f\n", b.name, b.author, b.price);
//s1、s2是变量
return 0;
}
结构体的初始化
//打印结构体信息
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);
使用指针访问和打印
struct S
{
char name[20];
int age;
float score;
};
void print1(struct S t)
{
printf("%s %d %f\n", t.name, t.age, t.score);
}
void print2(struct S* ps)
{
printf("%s %d %f\n", (*ps).name, (*ps).age, (*ps).score);
printf("%s %d %f\n", ps->name, ps->age, ps->score);
}
结构体变量.成员///结构指针->成员)
int main()
{
struct S s = { "zhangsan", 20, 85.5f };
print1(s);
print2(&s);//打印出来的是一样的
return 0;
}