关键字
- auto(局部变量——自动变量)
- break
- char
- const
- continue
- default
- typedef a b
将a重命名为b
- static b ;static a;static int add(int,int)
将b局部变量加长生命周期
将a全局变量的作用域限制在自己所在源文件
将函数add链接属性由外变内(外部不能引用)
- extern b;extern {int add(int,int)}
声明外部符号;声明外部函数add
- #define max 100;#define max (a>b?a:b)
定义标识符常量max为100
定义宏max为(a>b?a:b)
- 指针 p ;&(取地址符号);
p用来存放地址的指针变量,*——解引用操作符(找到p所指的地址)。
int* p 变量p的类型是int*。
指针字节大小看是32位(4)还是64位(8)和类型无关。
结构体;关键字:struck;
struck 类型名
{
}
b1是变量一本书
b1的指针类型是 stuct book*(b1是什么类型,指针就是什么类型)
结构体指针的引用
或
name是字符串不能直接赋值改,要用函数strcopy
入门
switch(整型表达式);{
case1 整型常量表达式 :
printf(“”);
break;
case2:
。。。。。
default://只是一个包含其他所有情况的case,运行语法和case一样
printf(”输入错误“);
break;
}
没有break;会从开始执行的地方一直执行到完。
循环语句
if(1){
printf(“”);
};
while(表达式){
循环语句;
break可以强制结束循环;
continue;跳出本次循环,进入下一次循环
}
getchar()键盘输入得到一个一个的字母 CTRL+z =eof
putchar()输出字母
第一个getchar用来消耗缓存里的回车
用循环消耗所有无用缓存字符eg:123 abc中的abc,中间空格不是‘\n’。
只接受数字。
for循环
for(表达式1初始化变量;表达式2判断条件;表达式3循环调整)
循环语句;
break;同样直接结束循环。continue也一样。
for内不要循环语句里改变量
for(;;)三个条件都可省略。但是不能随便省略
do while循环
do
循环语句;//至少执行一次
while(条件)
千万别在for循环里用int i=0,不然出循环 i 会初始化为0,//已验证
二分法查早 数组由小到大
strlen 字符串个数。减2因为数组末尾还有一个'\0'
字符串比较strcmp(a,b)。
当使用数组名作为scanf
函数的参数时,不使用取地址符&
是正确的。因为数组名本身就是一个指向数组第一个元素的指针,所以不需要使用&
来获取其地址。
c语言3种结构,顺序,选择,循环。
分支语句和循环语句
第一种
if(表达式)
{
语句1;
}
第二种
if(表达式)
{
语句1;
}
else
{
语句2;
}
第三种多分支
if(表达式)
{
语句1;
}
else if(表达式2)
{
语句2;
}
else
{
语句3;
}
错误写法:
18<10假 0<20真 所以无论如何都会输出青年。
正确写法
age<20&&18<age;
条件成立x,不成立y。
switch
switch(整型表达式){
case 1:
PRINFT("');
break;
case 2:
PRINFT("');
break;
case 3:
PRINFT("');
break;
case 4:
PRINFT("');
break;
}
;;;;;;;;;;;
辗转相除求最大公约数
闰年判断
8.分支和循环-作业+练习(3)(C语言程序设计教... P9 - 44:22
素数
1.试除法
8.分支和循环-作业+练习(3)(C语言程序设计教... P9 - 50:40
sqrt() 开平方函数
头部
对应方法
偶数肯定不是;// i+=2
1到100的9的个数;
计算1-1/2+1/3.....-1/100
用除法 想要代小数的结果就得有浮点数的参加运算。
flag可控制符号的变化
或者i+=2 分别计算加 和 减 的和然后计算;
10个数的数组的最大值
%2d 2位数不够补齐右对齐
%-2d 作对齐
99乘法表
8.分支和循环-作业+练习(3)(C语言程序设计教... P9 - 02:09:15猜数字
猜数字
rand()//生成随机数
srand()//随机数生成控制器;
time//时间戳:当前时间减计算机起始时间返回类型为long
srand((unsigned int)/*强制转换为int*/ time(null))随机值起点
goto//跳出多重循环
system()//执行系统命令
函数
strcpy(a,b)复制字符串b给a;
\0 是字符串结束标志读到就停了。
memset(a,‘c’,b)将a的前b个换为c(整型)。
自定义函数需要返回值定义函数类型不需要voide
函数内变量(形参)改变想影响主函数(实参)内要找地址
传值调用和传址调用的区别
9.函数(1)(C语言程序设计教程谭浩强 c语言谭... P10 - 01:31:54自定义函数
9.函数(1)(C语言程序设计教程谭浩强 c语言谭... P10 - 02:24:25
自定义啊函数传参,如果是数组实际只传数组首元素地址//数组名本质就是一个指针
函数内部想影响主函数值,传参数用地址;
地址++要写成:(*p)++
嵌套(函数相互嵌套使用)和链式访问()
#ifndef 头文件名//是否定义了【头文件名】//如果没有进行后面;
#define 头文件名//定义【头文件名】 不能有 · ;
//自定义函数声明
#endif
//防止引用定义多次造成浪费。
函数递归(函数自己调用自己)
重复操作归一化;
stack overflow//栈溢出;报错信息
unsigned//无符号、、定义变量用、、单词
void print(int a) {
if (a > 9)
{
print(a/10);
}
printf("%d ", a % 10);
}
int main()
{
unsigned int a = 0;
scanf("%d", &a);
print(a);
}
疑问:外部定义自定义函数需要声明头部吗?
//递归求阶乘
int jieceng(int n)
{
if (n > 1)
{
return n*jieceng(n-1);
}
else
{
return 1;
}
}
int main()
{
int n = 0;
printf("输入数字");
scanf("%d", &n);
printf("%d", jieceng(n));
}
//斐波那契数递归
int feibonaqie(int n)
{
if (n > 1)
{
return feibonaqie(n - 1) + feibonaqie(n - 2);
}
else
{
return 1;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d",feibonaqie(n));
}
优化,递归计算量太大;
int youhua(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
汉诺塔问题
move(int n, char A, char B, char C)
{
if (n > 1 )
{
move( n - 1, A, C, B);//A是开始位置,c是辅助位置,B是目标位置
printf("把第%d个圆盘从%c--->%c\n", n, A, C);
move(n-1, B, A,C);//B是开始位置,C是辅助位置,A是目标位置
/*printf("%c->%c\n", b, c);*/
}
else
{
//printf("%c->%c\n",a, b);
printf("把第%d个圆盘从%c--->%c\n", n, A, C);
//printf("%c->%c\n", b, c);
}
}
int main()
{
move(5, 'A', 'B', 'C'); //开始时,A是开始位置,B是辅助位置,C是目标位置
return 0;
}
数组
创建放10个数的数组 [不能是变量]
不完全初始化未定义位数是0
char arr2[5]={'a','b',98};//没有定义\0, 98是阿斯克码值
char arr1[5]="ab";//添加\0作为结束标识
char arr4[]="qwe";//大小自由分配以\0结尾
sizeof()计算所占空间大小;
strlen()求字符串长度以\0结束,不计\0;
单词
%p 打印地址用
数组在内存中是连续存放的;
二维数组
int arr[3][4]={{1,2,3},{},{},{}}//三行四列,不写就是0
int arr[][4]=//列不能省
char arr[3][4]//字符串
二维也是通过下标访问;
在内存中连续存放;
冒泡排序
//冒泡躺数;
void maopaopaixiu(int arr[], int sz)
{
int i;
for (i = 0;i < sz-1;i++)//冒泡躺数;
{
int j=0 ;
int flag=1;
for (j = 0;j < sz - 1 - i;j++) //每次干啥
{
int tem;
if (arr[j] < arr[j+1])
{
tem = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tem;
flag=0;
}
}
if(flag==1)//如果在某次循环后排序已经完成了,就不进行后面循环了;
{
break;
}
}
}
数组名 arr 就是&arr[0]//地址
自定义函数中传参的定义区别 char* arr和char arr【】
char* mystrcpy(char de[], char ser[]);mystrycpy是一个自定义函数 mystrcpy(arr2, arr1);是该函数的调用其中arr2和arr1是字符串数组;定义函数时char* mystrcpy(char de[], char ser[]);和char* mystrcpy(char* de, char* ser);有区别吗?char de[]是否等于char* de
在C语言中,地址和指针是相关概念,但并不完全相同。
一个地址是一个内存位置的标识,通常以十六进制数表示。指针是一个变量,它存储一个地址。因此,指针包含一个地址,但指针还有其他属性,比如指针可以进行解引用操作,以及可以进行指针运算。
在C语言中,数组名在很多情况下会隐式转换为指向数组第一个元素的指针,因此在函数参数中,`char de[]`和`char* de`在使用上会非常相似,因为它们都表示一个地址或者指向字符的指针。实际上,在函数内部,数组名`de`会被当作指针来处理,因此在函数内部,`de`可以像指针一样进行操作。
总之,虽然地址和指针在C语言中有关联,但它们并不是完全相同的概念。在函数参数中,`char de[]`和`char* de`可以在使用上非常相似,但在语义上有一些微妙的区别。
在C语言中,地址和指针是相关概念,但并不完全相同。
一个地址是一个内存位置的标识,通常以十六进制数表示。指针是一个变量,它存储一个地址。因此,指针包含一个地址,但指针还有其他属性,比如指针可以进行解引用操作,以及可以进行指针运算。
在C语言中,数组名在很多情况下会隐式转换为指向数组第一个元素的指针,因此在函数参数中,`char de[]`和`char* de`在使用上会非常相似,因为它们都表示一个地址或者指向字符的指针。实际上,在函数内部,数组名`de`会被当作指针来处理,因此在函数内部,`de`可以像指针一样进行操作。
总之,虽然地址和指针在C语言中有关联,但它们并不是完全相同的概念。在函数参数中,`char de[]`和`char* de`可以在使用上非常相似,但在语义上有一些微妙的区别。
arr[] 就是 &arr[0] 不能没有[],不然和变量分不开;
二行未知,三行是值
一行解引用得到值
二未知
两个例外:
//得到是整个数组值;