c语言学习

关键字

  • auto(局部变量——自动变量)
  • break
  • char
  • const
  • continue
  • default
  1. typedef a b

将a重命名为b

  1. static b ;static a;static int add(int,int)

将b局部变量加长生命周期

将a全局变量的作用域限制在自己所在源文件

将函数add链接属性由外变内(外部不能引用)

  1. extern b;extern {int add(int,int)}

声明外部符号;声明外部函数add

  1. #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]       不能没有[],不然和变量分不开;

二行未知,三行是值

一行解引用得到值

二未知

两个例外:

//得到是整个数组值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值