
C语言软知识
大志出奇迹
热爱嵌入式技术,未出茅庐的小小白
展开
-
一道快速排序结合二分法查找的算法题(综合易考)
在校招笔试时曾看见一道题目比较综合的关于排序的编程题,从动态分配数组到使用快速排序对数组进行排序再到使用二分法查找给定数字,到最后释放数组内存。感觉全方面考察了创建数组、排序、查找的相关知识点,遂记录下来。原创 2023-10-15 11:56:32 · 113 阅读 · 0 评论 -
[超详细]内存分区相关知识,面试重点
静态变量是在程序运行期间始终存在的变量,其内存空间在程序开始时就被分配好了,直到程序结束时才被释放。已初始化且不为零的全局变量是指在定义时已经赋值的全局变量,而不是在程序运行时才赋值的变量。堆空间是向上增长的,也就是说,堆顶的地址是越来越大的。因此,常量段的数据是只读的,不能在程序运行期间修改它们的值。栈空间是由操作系统自动分配和回收的,它的大小通常是固定的,不能随意增加。栈空间是向下增长的,也就是说,栈顶的地址是越来越小的。需要注意的是即使是初始化了,但初始化的是0,还是放在BSS区!原创 2023-08-04 17:22:29 · 409 阅读 · 1 评论 -
关于%d,%02d的输出问题
原文链接:https://blog.youkuaiyun.com/weixin_64634186/article/details/123459291。总结:无论哪种表示方法如果我们定义的整数的位数大于我们想输出的数字的位数,输出时仍然 是我们定义的数字。4. %m.n表示我们输出的数字一共占m个位数,小数点后占n个。原创 2023-06-17 17:20:51 · 103 阅读 · 1 评论 -
堆与栈的区别
堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大的空间,如果没有足够大的空间(可能是由于内存碎片太多),就有需要操作系统来重新整理内存空间,这样就有机会分到足够大小的内存,然后返回。栈的分配和释放是由编译器完成的,栈的动态分配由alloca()函数完成,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行申请和释放的,无需手工实现。栈的增长方向是向下的,即向着内存地址减小的方向。(1)管理方式不同。原创 2023-09-02 10:21:32 · 164 阅读 · 0 评论 -
关于int (*cmp)(const void* e1, const void* e2)中的(char*)base+j*width
通过(char*)base+j*width的形式可以很好找到两个内容的地址,转换成char*是因为其偏移大小为1所以代码的兼容性更好,如果要比较的是char类型那么width是1,如果是int类型那么width是4,如果要是doule类型那么width是8。但是强制转换成int*的话,如果要比较的是char类型那么width需要是1/4,如果是int类型那么width需要是1,如果要是doule类型那么width需要是2。在不知道这两个指针的类型的前提下如何找到实现两个地址中内容的比较。原创 2023-06-30 11:57:58 · 140 阅读 · 0 评论 -
指针数组和数组指针
C语言—指针数组与数组指针_指针数组和数组指针_竹北1998的博客-优快云博客原创 2023-06-09 20:17:51 · 75 阅读 · 1 评论 -
const在不同的位置
对于1和2来说,对于const在*左边,表示的是a指向的内容是不能改变的,但是指针是可以改变的。对于3来说,const在*右边,表示的a的指针是不能变的,但是指针的内容是可以变的。第二个表示这个函数是只读的函数,函数里面的成员数据不能改变,只能读取。对于4来说,指针指向的地址不能变,并且地址里面装的东西也不能够变化。第一个const表示的是函数返回值是const类型的,返回的是常量。原创 2023-06-09 15:26:08 · 255 阅读 · 1 评论 -
字符串常量与字符数组的区别
总结:C语言有两种表示字符串的方法,一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。原文链接:https://blog.youkuaiyun.com/qq_43353179/article/details/109353528。原创 2023-06-08 20:23:25 · 264 阅读 · 1 评论 -
new/delete与malloc/free的区别
new做两件事,一是分配内存,二是调用类的构造函数;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针。malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。new、delete是C++中的操作符,malloc和free是标准库函数。,并且可以自动计算所申请内存的大小。new建立的是一个对象,而malloc分配的是一块内存。new申请的空间会初始化,而malloc不会初始化。原创 2023-06-06 16:01:21 · 367 阅读 · 0 评论 -
C/C++程序内存分布情况
已初始化且不为零的全局变量是指在定义时已经赋值的全局变量,而不是在程序运行时才赋值的变量。BSS区(bss segment):存放未初始化的全局变量和静态变量的区域,该区域的值默认初始化为0。即使是初始化了,但初始化的是0,还是放在BSS段!因此,常量区的数据是只读的,不能在程序运行期间修改它们的值。这些常量的值在程序运行期间不会被改变,因此它们被存放在内存的只读区域,以保证它们的值不会被意外修改。数据区(data segment):存放已经初始化的全局变量和静态变量(包括全局和静态变量的指针)的区域。原创 2023-06-04 16:28:37 · 175 阅读 · 1 评论 -
关于(* ( void ( * ) ( ) ) 0 ) ( )
2.( void ( * ) ( ) ) 0 :对0进行强制类型转换,被解释为一个函数地址。4.( * ( void ( * ) ( ) ) 0 ) ( ) :调用0地址处的函数。3.*( void ( * ) ( ) ) 0 :对0地址进行解引用操作。1.void ( * ) ( ) :是函数指针类型。此代码的意义是调用0地址处的函数。该函数无参,返回类型是void。原创 2023-06-26 10:16:59 · 215 阅读 · 1 评论 -
关于void (* signal ( int, void ( * ) ( int ) ) ) ( int )
signal先和()结合,说明signal是一个函数名 signal函数有两个参数,第一个参数的类型是int,第二个参数的类型是函数指针(该函数指针指向一个参数是int,返回值是void的函数) signal函数的返回类型也是一个函数指针(该函数指针指向一个参数是int,返回值是void的函数) 综上所述,signal是一个函数的声明原创 2023-06-26 10:58:09 · 314 阅读 · 1 评论 -
一文搞定函数指针数组和函数数组指针
函数指针数组和函数数组指针。原创 2023-06-26 16:55:55 · 128 阅读 · 1 评论 -
使用sizeof计算数组相关大小
sizeof(数组名):数组名表示整个数组,所以计算的是整个数组的大小sizeof(&数组名):取出的是整个数组的地址,所以计算的是地址大小除上述两种情况外,所有数组名都是数组首元素的地址原创 2023-07-07 09:41:44 · 3574 阅读 · 1 评论