C语言初学笔记
计算机中数据的存储:
内存,硬盘,高速缓存,寄存器,网盘云端
内存大小:网盘(不限制)>硬盘(硬件设定)>内存(8-16G)>高速缓存(几十MB)>寄存器(更小)
大量被频繁使用的数据会放入寄存器中,提高使用效率
Signed:有符号的
Unsigned:无符号的
Static:静态的,修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型)
Union:联合体(共用体)
Void:空
Volatile:防止编译器对代码进行优化(特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。)
Define与include不是关键字,属于预处理指令
#typedef:类型重定义
栈区:局部变量,函数的参数
堆区:动态内存的分配
静态区:全局变量,static修饰的静态变量
全局变量具有外部链接属性,被static修饰后,变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了
指针就是地址
内存是电脑上重要的存储器,计算机中所有程序的运行都是在内存中进行的。
所以为了有效地使用内存,就把内存划分成了一个个小内存单元,每个内存单元大小为1个字节,为了能够有效的访问到内存的每个单元,就给了内存单元进行了编号,这些编号就是地址
32位与64位指的就是地址线
最终一个内存单元是一个字节,然后分配地址
%p专门用来打印地址
*用来修饰指针变量
Int*说明指针变量执行的对象是int类型
指针的大小是相同的,因为指针是用来存放地址的,指针所占空间取决于地址的存储所占空间
32位电脑一个地址4个字节
64位电脑一个地址8个字节
结构体
描述复杂对象
*ps.相当于ps->
->用法:结构体指针->成员变量名
& * . ->
分支语句
Ifelse语句不加{},只会默认执行一条语句
Else和最近的if匹配
Switch语句中,case决定入口,break决定出口
Case后面要求是整型常量表达式
最后一个case的break也尽量加上
Default不规定位置,用于处理异常
Switch允许嵌套使用
循环语句
1、 While
Break在while中用于永久终止循环
Continue是直接跳过本次循环continue后面的代码,直接跳去判断部分,看是否进行下一次循环
l Getchar函数用法:从键盘获取字符,返回的类型是int,
EOF意为end of file –文件结束标志
l Putchar函数用法:输出一个字符
Ctrl+z就相当于让键盘读入一个EOF
数组的数组名本身就是一个地址
问题一:Getchar读取\n
解决方法:再加个getchar();拿走换行
问题二:getchar只消耗缓冲区里一个字符,如果有很多,处理不掉
解决方法:
使用while循环清理多个字符
2、 do while
基本格式:
Do
循环语句;
While(表达式);
3、 for
格式:
表达式1:初始化,表达式2:判断,表达式3:调整
For(表达式1;表达式2;表达式3)
循环语句;
不可在for循环体内修改循环变量,防止for循环失去控制
建议for语句的循环控制变量的取值采用“前闭后开区间”写法
判断语句省略恒为真是语法规定
REP函数是用于创建重复序列的函数,其能将某一向量重复若干次
练习:在一个有序数组中查找具体数字n
练习:阶乘类
//计算任意数阶乘
//for循环
/*int i = 0;
int j = 0;
int sum = 1;
printf("计算n!,n=");
scanf("%d", &i);
for (j = 1; j <= i; j++)
{
sum = sum * j;
}
printf("%d %d %d", i,j, sum);*/
//while循环
/*int i = 0;
int j = 1;
int sum = 1;
printf("计算n!,n=");
scanf("%d", &i);
while (j<=i)
{
sum = sum * j;
j++;
}
printf("%d", sum);*/
//do while循环
/*int i = 0;
int j = 1;
int sum = 1;
printf("计算n!,n=");
scanf("%d", &i);
do
{
sum = sum * j;
j++;
} while(j <= i);
printf("%d", sum);*/
//测试
//不使用j
//int i = 0;
//int j = 0;
//int sum = 1;
//printf("计算n!,n=");
//scanf("%d", &i);
//for (i; (i-1)>0; i--)
//{
// sum = sum * i;//sum *= i;
//}
//printf("%d", sum);
//计算1!+2!+3!+...+n!
//int i = 0;
//int j = 0;
//int sum1 = 1;
//int sum2 = 0;
//printf("1!加到n!,n=");
//scanf("%d", &i);
//for (i; (i - 1) > 0; i--)
// {
// sum1 = sum1 * i;//sum *= i;
// sum2 = sum2 + sum1;
// }
//printf("%d %d", sum1, sum2);
//int i = 0;
//int j = 0;
//int sum = 1;
//int num = 0;
//printf("计算n!,n=");
//scanf("%d", &i);
//for (j = 1; j <= i; j++)
//{
// sum = sum * j;
// num += sum;
//}
//printf("%d %d %d ", i, j, sum);
//printf("%d",num);
演示多个字符从两端向中间汇聚
Sleep(number);//表示程序暂停运行number毫秒。S要大写
system("cls");//清空屏幕
char arr[] = “abc”;
[a b c \0]
两个字符串比较不能用==,应该使用strcmp
比较ASCII码值
//登陆程序,登录三次
int i = 0;
//假设正确密码是字符串“123456”
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
//if (password == "123456")--两个字符串比较不能用==,应该使用strcmp
if(strcmp(password,"123456")==0)
{
printf("密码正确\n");
break;
}
else
{
printf("密码错误\n");
}
}
//密码三次错误
if (i == 3)
printf("三次密码错误,程序退出");
rand:产生一个伪随机数,需要引入头文件stdlib
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
//猜数字游戏
//需求:
//1、自动产生一个1-100的随机数
//2、猜数字,猜对了,就游戏结束,猜错了,告诉玩家猜大了还是猜小了,知道猜对为止
//3、游戏可以一直玩,知道退出游戏
//打印一个简易菜单
void menu()
{
printf("=================================\n");
printf("============ 1、play ============\n");
printf("============ 0、exit ============\n");
printf("=================================\n");
}
//猜数字游戏实现
void game()
{
//1.先生成随机数
//rand函数返回一个0-32767之间的数字
//srand()需要括号里是随机值才能生成随机数
//时间 - 时间戳
//%100的余数是0-99,然后+1,最后范围就是1-100.
int ret = rand()%100+1;//需要引入头文件stdlib
//printf("%d\n", ret);
//2.猜数字
while (1)
{
int guess = 0;
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else {
printf("猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();//打印菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
F11 – 逐语句
F10 – 逐过程
int func(int a)
{
int b;
switch (a)
{
case 1:b = 30;
case 2:b = 20;
case 3:b = 16;
default:b = 0;
}
return b;//求func(1)
}
int main() {
printf("%d\n", func(1));
return 0;
}
练习
int main()
{
int x = 3;
int y = 3;
switch (x % 2)
{
case 1:
switch (y)
{
case 0:
printf("first");
case 1:
printf("second");
break;
default:
printf("hello ");
}
case 2:
printf("third");
}
return 0;
}
// 从大到小排位
//int main()
//{
// int x = 0;
// int y = 0;
// int z = 0;
// //输入
// printf("输入三个数:");
// scanf("%d %d %d", &x, &y, &z);
// //调整数据
//
// if (x > y && x > z)
// {
// if (y > z)
// {
// printf("%d %d %d", x, y, z);
//
// }
// else
// {
// printf("%d %d %d", x, z, y);
// }
// }
// else if (y > x && y > z)
// {
// if (x > z)
// {
// printf("%d %d %d", y, x, z);
// }
// else
// {
// printf("%d %d %d", y, z, x);
// }
// }
// else if (z > x && z > y)
// {
// if (x > y)
// {
// printf("%d %d %d", z, x, y);
// }
// else
// {
// printf("%d %d %d", z, y, x);
// }
// }
//
//
// return 0;
//}
另一种
//int main()
//{
// int x = 0;
// int y = 0;
// int z = 0;
// //输入
// printf("输入三个数:");
// scanf("%d %d %d", &x, &y, &z);
// //调整数据
// if (x < y)
// {
// int tmp = x;
// x = y;
// y = tmp;
// }
// if (x < z)
// {
// int tmp = x;
// x = z;
// z = tmp;
// }
// if (y < z)
// {
// int tmp = y;
// y = z;
// z = tmp;
// }
// printf("%d %d %d", x, y, z);
// return 0;
//}
//求1-100之间所有3的倍数
全部公约数
求最大公约数
int main()
{
int x = 0;
int y = 0;
int i = 0;
printf("请输入两个数:");
scanf("%d %d", &x, &y);
//设最大公约数是xy中较小值
if (x > y)
{
i = y;
}
else
{
i = x;
}
while (1)
{
if (x % i == 0 && y % i == 0)
{
printf("最大公约数为:%d", i);
break;
}
i--;
}
return 0;
}

浙公网安备 33010602011771号