C语言学习笔记-知识点随记3

不定长数组的创建(动态地址申请)

使用malloc函数继续动态地址申请                                                                                                      需要添加头文件stdlib.h 

int *arr;
int n=0;
arr = (int*)malloc(n * (sizeof(int)));//申请一个n长度的内存地址

其中第一个int*是由于申请的数组是arr是int类型的数组

malloc()的括号里面是字节数量,因此n个元素的数组就是n*每个元素的字节数量(sizeof(int))

申请完地址要对地址进行清零

清零要使用到memset函数                                                                                                                  需要添加头文件memory.h 

memset(arr, 0,4*n);//清空数组 按照字节清空

4*n等同于上一段讲的 n*(sizeof(int)) 等同于字节数

使用完毕后还要释放内存

free()函数 头文件stdlib.c

free(arr);//释放内存

括号内是数组首元素地址/数组名/指针变量名

系统命令

dir查找 cls清屏幕...调用system(“”)执行。引用头文件windows.h

system("cls");//清理exe的屏幕

do  while的continue

do
{
    continue;
}while(判断条件)//continue直接来到while条件判断位置处

scanf的返回值

scanf的返回值是所得到的该类型的元素个数,可以用来检测所输入的数值是否合乎要求

清空返回区的必要性

在一些需要输入的地方需要再输入后清空缓冲区,不然就会出现bug

printf的返回值

printf的返回值是其实际控制输出的字符数

printtf("aa%d%c\n",a,b);//aa算两个 %d %c各算一个,\n算一个

链式访问

printf("%d\n",printf("%d\n",printf("%d\n",43)))  

递归

1.要有结束条件

2.要越来越接近这个条件

3.递归在思想上是最后一次开始往回执行所需要的操作

4.递归位置前是判断和所需要的条件,递归位置后是要接收返回值的位置

递归会一直在栈区申请空间,如果递归很多次容易造成栈区溢出

位操作

  • 1、交换律
  • 2、结合律 (a^b)^c == a^(b^c)
  • 3、对于任何数x,都有 x^x=0,x^0=x
  • 4、自反性: a^b^b=a^0=a;

函数的知识点

将形参存在数组种,修改数组的内容,可以通过数组将修改结果带出

形参如果使用指针,最终指向外部的实参,在函数中对指向内容进行修改,改变的就是外部的实参。

全局变量不受函数的结束而结束,在函数中改变全局变量,主函数可以看到改变以后的结果。(最好少用全局变量)

函数的设计应该追求高内聚低耦合:函数体内部修改,尽量不要对外部产生影响,否则不方便维护影响稳定性。

参数谁申请的就谁维护谁释放,外部使用者可能不知道或者会忘记,容易造成资源泄露。

逗号表达式

(a,b)先算a,再算b,最后整个逗号表达式的值是b的值

sizeof的返回值无符号整型

多组输入的形式

scanf(" _%c")%c前面加上空格可以消掉前面所有的空白字符(指空格符、制表符、回车符),加上getchar清除掉后面的字符
1.

while(~scanf(" %c",&ch))//%c前面加上空格吸收空白符
{
    //代码段
    while((ch=getchar())!='/n')
    {
        ;//清空缓冲区
    }


}

2.

while(scanf(" %c",&ch)!=EOF)//%c前面加上空格吸收空白符
{
    //代码段
    while((ch=getchar())!='/n')
    {
        ;//清空缓冲区
    }


}

整型提升

C的整型算术运算总是至少以缺省整型类型(缺省:缺少省略时候的默认值)的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

整型提升的意义: 表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转 换为int或unsigned int,然后才能送入CPU去执行运算。

1.正数的整型提升 全部补0(高位符号位)

2.负数的整型提升 全部补1(高位符号位)

int main()
{
 char a = 0xb6;
 short b = 0xb600;
 int c = 0xb6000000;
 if(a==0xb6)//整型提升以后a为0xffffffb6(补码)
 printf("a");
 if(b==0xb600)
 printf("b");
 if(c==0xb6000000)
 printf("c");
 return 0;
}

int main()
{
 char c = 1;
 printf("%u\n", sizeof(c));
 printf("%u\n", sizeof(+c));
 printf("%u\n", sizeof(-c));
 return 0;
}


int main()
{
	char a = 5;
	//截断
	//00000000000000000000000000000101
	//00000101

	char b = 126;
	//00000000000000000000000001111110
	//01111110

	//00000000000000000000000000000101 - a
	//00000000000000000000000001111110 - b
	//00000000000000000000000010000011
	//10000011 - c
	//当a和b相加的时候,a和b都是char类型
	//表达式计算的是就要发生整形提升
	
	char c = a + b;
	//10000011 - c
	//11111111111111111111111110000011 - 补码
	//11111111111111111111111110000010
	//10000000000000000000000001111101 -> -125
	printf("%d\n", c);//?

	return 0;
}

算术转换

long double        (高)
double               ^
float                |
unsigned long int    |
long int             |
unsigned int         |
int                (低)

如果某个操作数的类型在这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运 算。(一般计算浮点数有一个浮点数类型结果就为浮点数的情况是一样的,但是接受结果的参数如果不是浮点型,会导致精度丢失)

float f = 3.14;
int num = f;//隐式转换,会有精度丢失

操作符特性

复杂表达式的求值有三个影响的因素。

1. 操作符的优先级

2. 操作符的结合性

3. 是否控制求值顺序。

两个相邻的操作符先执行哪个?取决于他们的优先级

如果两者的优先级相同,取决于他们的结合性

*一些表达式看起来没问题,但是不同编译环境下结果不一样,这种属于问题代码,要加以抵制,尽量保证写出来的代码机器能读懂,不同环境不会受影响,稳定输出结果。

你可能感兴趣的:(c语言)