C语言复习tips(二)

C语言复习tips(二)

以下知识点是我在学习C语言课程的过程中零零散散地记录下来的,分两次贴出来,认为有用的小伙伴可以先收藏哦❤️有问题请在评论区指出。蟹蟹~~😄😄

36)排序方法中

      冒泡法是每次将n个数中相邻的两个数比较,小的调到前面,直至最大的数调到最后面,以此类推,每一轮减少最后一个数。

      选择法是先将n-1个数中最小的一个数与a[0]对换,以此类推,每一轮往后挪动一个数,并与下一个数对换。

37)冒泡法的结构

int a[M],t;     //(M是常数)
for(int j=0;j<M-1;j++)
	for(int i=0;i<M-1-j;i++)
		if(a[i]>a[i+1]){
       	t=a[i];
       	a[i]=a[i+1];
       	a[i+1]=t;
      	}

38)选择法的结构

int a[N],t,k;   //(N是常数)
for(int i=0;i<N-1;i++){
   	k=i;
	for(int j=i+1;j<N;j++)
		if(a[j]>a[k])
       	k=j;
	t=a[k];a[k]=a[i];a[i]=t;
}

39)如果利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。例如:char str1[5],str2[5],str3[5];

      scanf("%s%s%s",str1,str2,str3);

      输入数据:

      How are you?

      输入状态为:str1[5]={‘H’,‘o’,‘w’,’\0’}

​             str2[5]={‘a’,‘r’,‘e’,’\0’}

​             str3[5]={‘y’,‘o’,‘u’,’?’,’\0’}

40)通过字符数组名或字符指针变量可以输出一个字符串,而对一个数值型数组是不能够企图用数组名输出它的全部元素的。对于数值型数组的元素值,只只能逐个输出。

41)可以在不定义字符数组的情况下,只定义一个字符指针变量,用它指向字符串常量中的第一个字符。C语言字符串常量是按字符数组处理的。由于这个字符数组没有名字,因此不能够通过数组名的引用,只能通过指针变量来引用。

42)编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量只分配一个存储单元,用来存放地址。在定义指针变量后应当及时把一个字符变量(或字符数组数组元素)的地址赋给它,使它指向一个字符型数据,如果未对它赋予一个地址值,那它就没有指向一个确定的对象。此时如果通过键盘向指针变量输入数据,可能会出现严重后果。

43)字符数组中各元素的值是可以改变的(即可以再赋值),但字符指针变量指向字符串常量中的内容是不可以被取代的(即不能再赋值)。

44)宏定义分为普通宏定义和带参数的宏定义

      //普通宏

      #define Pi (3.1415926)

      //带参数的宏 (宏函数)

      #define max(a,b) ((a)>(b)? (a),(b))

      注意变量在宏中要用括号括起来,因为,在C语言中define宏定义在编译时,会被展开,进行“傻瓜式”替换,也称为“字面”替换,如果没有括号有可能会产生歧义。如:

      int a,b,c,d,e;

      a=1;b=2;c=3,d=4;

      e=f(a+b)* f(c+d) ; //理论值e=9*100=9001.

      1>#define f(x)(x*x)

      替换结果为:e=(a+ba+b)(c+dc+d) = 519=95

      2> #define f(x) x*x

      替换结果为:e=a+ba+bc+d*c+d=1+2+6+12+4=43

      3>#define f(x) ( (x)*(x) )

      替换结果为:e=( (a+b)(a+b)(c+d)(c+d) )=3377=441

45)一般情况下是对结构体变量中的各个成员进行赋值或存取以及运算,但如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,再进行操作。

46)结构体类型中的成员名可以与程序中的变量名相同并且二者并不代表同一对象。但是用结构体定义的变量名不可以与程序中的变量名相同。

47)数组元素可以作函数实参,不能作形参。因为C语言编译器并不检查形参数组的大小,只是将实参数组首元素的地址传给形参数组名。

48)在函数调用时,数组名或指针变量作函数参数的调用称为传地址调用;普通变量作函数参数的调用称为传值调用。

49)通过指针引用二维数组,就涉及到行指针int(p)[N]与列指针intp,应注意列指针是不允许像行指针那样以二维形式表示的。列指针指向二维数组的元素是需要算相对位移量的。

50)定义指向函数的指针变量p,将函数入口地址赋给p后,在函数指针变量调用函数时,只须将(*p)代替函数名,再在(*p)之后的括号中根据需要写上实参即可。

51)指针变量是用来存放地址的,一个任何类型的指针变量所占的字节大小一般为4个字节。

52)void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可由编译系统自动进行隐式转换。无论用那种转换,首先必须了解要进行类型转换。

53)如果p指向一个结构体变量stu,以下3种访问成员的用法等价:

      1> stu. 成员名(如stu.num);

      2> (*p).成员名(如(*p).num);

      3> p->成员名(如p->nun);

54)C语言的编译器以压栈式存储的,所以输出时是从栈顶往栈底读取数据的,但我们看到在用printf输出时,是从右往左进行的。(有的编译器有些例外)

55)在绝大多数表达式中,数组名的值是指向数组第一个元素的指针。这个规则只有两个例外。sizeof返回整个数组所用的字节而不是一个指针所占用的字节;单目操作符&返回一个数组的指针而不是一个指向数组第一个元素的指针的指针。

56)字符串的列表可以以矩阵的形式存储,也可以以指向字符串常量的指针数组形式存储。在矩阵中,每行必须与最长字符串的长度一样长,但它不需要任何指针。指针数组本身要占用空间,但是每个指针所指向的字符串所占用的内存空间就是字符串本身的长度。

57)malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0。另一个较小的区别是它们请求内存数量的方式不同。

58)realloc用于修改一个已经分配的内存块的大小,即将一块扩大或缩小。缩小时尾部内存被丢弃;扩大时原先内容依然保留。如果原先的内存块无法扩大,realloc函数将分配另一块正确大小的内存,并将原先那块内存的内容复制到新的块上 。因此,在使用realloc之后,你就不能再使用指向旧内存的指针,而应改用realloc所返回的新指针。

59)realloc之后,你就不能再使用指向旧内存的指针,而应改用realloc所返回的新指针。

60)在这里插入图片描述请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值