道阻且长,接下来就要开始数据结构的学习,而学不可以不练,在接下来的学习中,数据结构学习的同时,c语言训练也要开始更新了~
NO.1 函数
1.void函数声明
这道题一看就秒了(开玩笑)我们在知道答案的同时,也要明白其中的知识点(其实就是我的表达能力不好,想要向别人解释有点困难,所以借着复习来锻炼自己😝)
考点:函数声明 void
解析:void是这个函数返回的类型,这个类型就是没有类型的空类型,代表这个函数的返回值是空。
void也用于声明一些万能指针. 比如你要用一个指针,但是还不确定这个指针会指向什么类型的变量,那就申请一个void类型的指针,它就叫做万能指针,因为它可以指向任何类型的变量.
在c语言中,凡不加返回值类型限定的函数,都会被编译器作为返回整型值处理
NO.2 交换变量
失误
在实际编写代码时尽量不要用B,因为可能会出现溢出(即两个变量之和可能会超过变量类型能表示的最大范围)。
可以改为a^=b;b^=a;a^=b;不需要考虑溢出,a^=b,此时a记录了a和b两个数中二进制的异同情况,1表示不同,0表示相同。
NO.3 指针
一.函数指针和指针函数
1.指针函数:当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,用于需要指针或者是地址的表达式中。是指带指针的函数,本质是函数
声明格式:类型说明符 *函数名(参数)
2.函数指针:指向函数的指针包含了函数的地址,可以通过它来调用函数。
声明格式:类型说明符 (*函数名)(参数)
拓展(复习):数组指针和指针数组
二.定值和定址
const意思为"只读的",口诀:左定值,右定址(const在*的左边值不能变,在*的右边地址不能变)。
const int和int const的意思是一样的,也就是说,我们要从const* int和int*const中选择。
如果是const* int ptr,那么const限制的是*ptr,也就是地址,而ptr的值是可以改变的
如果是* const int ptr,那么const限制的是ptr,也就是值,而地址是可以改变的
如果是const int* const x,那么值和地址都被限制,不能改变。
注意:只要 在*之后有 const限定符,则该指针在声明时必须初始化 : 否则就是野指针
NO.4 分支和循环
一.if语句
这道题本身很简单,而需要注意的是,对于for(;;)循环体,中间的表达式一般是个判定条件,返回布尔型。而for(表达式1;表达式2;表达式3)中,表达式2是判断,j=0这个表达式为0,因此判断条件为false,不会执行循环。
赋值语句的返回值是赋给的值
NO.5 操作符
三目操作符从右到左计算
NO.6虚函数和纯虚函数
纯虚函数是以=0为结尾的,并加上virtual关键字,且没有函数体的函数。
需要注意:
1、当类声明中包含纯虚函数时,则不能创建该类的对象
2、包含纯虚函数的类只用作基类
3、在类中使用=0指出类是一个抽象基类,在类中不可以定义该函数,只能声明
NO7.内存
1.动态内存管理
malloc和calloc的区别
1,malloc
函数原型:
void* malloc(unsigned size);
函数功能:
在堆内存中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度。
2,calloc
函数原型:
void* calloc(size_t numElements, size_t sizeOfElement);
函数功能:
与malloc相似,参数sizeOfElement为单位元素长度(例如:sizeof(int)),numElements为元素个数,即在内存中申请numElements * sizeOfElement字节大小的连续内存空间。
3,realloc
函数原型:
void* realloc(void* ptr, unsigned newsize);
函数功能:
使用realloc函数为ptr重新分配大小为size的一块内存空间。下面是这个函数的工作流程:
(1),对ptr进行判断,如果ptr为NULL,则函数相当于malloc(new_size),试着分配一块大小为new_size的内存,如果成功将地址返回,否则返回NULL。如果ptr不为NULL,则进入(2)。
(2),查看ptr是不是在堆中,如果不是的话会抛出realloc invalid pointer异常。如果ptr在堆中,则查看new_size大小,如果new_size大小为0,则相当于free(ptr),将ptr指向的内存空间释放掉,返回NULL。如果new_size小于原大小,则ptr中的数据可能会丢失,只有new_size大小的数据会保存;如果size等于原大小,等于什么都没有做;如果size大于原大小,则查看ptr指向的位置还有没有足够的连续内存空间,如果有的话,分配更多的空间,返回的地址和ptr相同,如果没有的话,在更大的空间内查找,如果找到size大小的空间,将旧的内容拷贝到新的内存中,把旧的内存释放掉,则返回新地址,否则返回NULL。
二,malloc、calloc、realloc之间的区别
1,是否会对申请的内存空间进行初始化
函数malloc不能初始化所分配的内存空间,函数calloc() 会将所分配的内存空间中的每一位都初始化为零。
2,功能上的区别
malloc与calloc用来动态分配内存空间,而realloc则是对给定的指针所指向的内存空间进行扩大或者缩小。
NO8.数组
NO.9 delete
NO.10指针
NO.11实型常数:
C语言语法规定,字母e或E之前必须要有数字,且e或E后面的指数必须为整数。如e3、5e3.6、.e、e等都是非法的指数形式。 E/e前面为十进制整数或实数,E/e后面为十进制整数且不能为实数,前后都不能省略
关键在于熟练掌握操作符的优先级和++的使用方法
写法一
y=*px+1; //y=(*px)++
此处*为间接访问,px指向地址的内容+1后的值赋给y。
此时,x=4,y=3。
写法二
y=*px++; //y=*(px++);
这里*(取值符)和++为同一优先级,px先和++结合;但会先使用px指向地址的内容并赋给y,之后px的值+1,只是改变了px指向的地址。
此时,x=3,y=3(这里大部分机器的结果 * px=3是因为系统给xy分配了相邻的地址,px+1指向的地址变成y的地址,如果xy的地址不相邻,则 * px的值不确定)。
两种写法 * px++和 * px+1的区别是后者是px指向地址的内容+1,前者是px指向的地址+1,所有后者、即单独的 * px++;等价于px++,是一种容易误解的写法,在实际程序中不会用到 * px++;这样的语句。
写法三(扩展)
y=*++px;
类似,px先和++结合;这次会先让px指向的地址+1,之后把px指向地址的内容赋给y,当然这个值是不确定的(一般系统给xy分配的地址是相邻的,所以px指向的地址一般就是y的地址,也就是说y的内容并为改变)。
此时,x=3,y= ?。
NO.12fscanf sprintf fgets read pread write pwrite fseek lseek
NO.13memcpy memmove
%d整型输出,%ld长整型输出,
%o以八进制数形式输出整数,
%x以十六进制数形式输出整数,
%u以十进制数输出unsigned型数据(无符号数)。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数,以小数形式输出,
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。
其中%o和%x都是二进制的延伸,即八进制和十六进制,可以适用于unsigned变量输出
NO.14检测运算过程中整型溢出的方法
NO.15返回值
c c++中 返回值 只能有一个。 或者void ,没有返回值类型。
考虑到c++中的绑定器,类似可以返回多个值。结果不可以。
绑定器(Binder)是一种函数对象,它可以将一个或多个参数绑定到函数中的特定值,从而创建一个新的可调用对象
若想实现返回多个值的效果:使用struct 在函数体中,将要返回的多个值,赋到struct变量中,返回结构体变量。