- 博客(17)
- 收藏
- 关注
原创 C语言——删除有序数组中的重复项
给你一个非严格递增排序的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致,然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:1.更改数组nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。2.返回k。
2024-06-04 16:33:29
334
原创 C语言——移除元素
给你一个数组nums和一个值val,你需要原地移除所有数值等于val 的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设nums中不等于val 的元素数量为k,要通过此题,您需要执行以下操作:1.更改nums数组,使nums的前k个元素包含不等于val 的元素。nums的其余元素和nums的大小并不重要。2.返回k。
2024-05-30 17:05:44
230
原创 C语言预处理
case注意:1.宏参数和#define定义中可以出现其他#define定义的变量。但是对于宏,不能出现递归。2.当预处理器搜索#define定义的符号时,字符串常量的内容不被搜索。
2024-05-13 11:11:52
1696
1
原创 C语言文件操作
在文件读取过程中,不能用feof函数的返回值直接用来判断文件的读取是否结束,而是应用于当文件读取结束时,判断是读取失败结束,还是遇到文件尾结束。2.二进制文件的读取结束判断,判断返回值是否小于实际要读取的个数(fread)。fprintf 针对所有输出流的格式化输出语句 - stdout/文件。fscanf 针对所有输入流的格式化输入语句 - stdin/文件。根据文件指针的位置和偏移量来定位文件指针。返回文件指针相对于起始位置的偏移量。让文件指针的位置回到文件的起始位置。
2024-05-08 20:58:49
771
1
原创 动态内存开辟笔试题
1)str传给GetMemory函数时是值传递,因此GetMemory函数的形参p只是str的一份临时拷贝,在GetMemory函数内部动态申请空间的地址,存放在p中,不会影响外部的str,所以当GetMemory函数返回之后,str依然是NULL,所以strcpy会失败。GetMemory函数内部的数组是在栈区上创建的,出了函数,生命周期结束,p数组的空间就还给了操作系统,因此返回的地址是没有实际意义的,如果通过返回的地址去访问内存,就是非法访问内存。(在堆区上开辟的空间,出了函数范围不销毁。
2024-05-05 17:03:28
190
3
原创 动态内存开辟
3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应大于结构的大小,以适应柔性数组的预期大小。情况2:原有空间之后没有足够大的空间,则在堆空间上另找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址。calloc函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。情况1:原有空间之后有足够大的空间,则直接在原有内存后追加空间,原有数据不发生变化。4.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
2024-05-02 21:46:31
330
1
原创 自定义类型
联合体是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特点是这些成员共用同一块空间(所以联合体也叫公用体)。1.位段的成员必须是int、unsigned int 或 signed int。位段的空间上是按照需要以4个字节(int)或1个字节(char)的方式来开辟的。2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。2.和#define定义的标识符比较,枚举有类型检查,更加严谨。2.位段的成员后边有一个冒号和一个数字。1.联合体的大小至少是最大成员的大小。
2024-04-26 19:22:33
255
原创 结构体的大小计算
三个成员的对齐数分别为1、4、1,最大对齐数为4,因此结构体的总大小应该为4的整数倍,而上述计算出的大小为9,不是4的整数倍,往后数,12才是4的整数倍,因此需要再浪费3个内存空间,最终结构体的大小为12,如下图所示。第二个成员i是int,大小为4个字节,而VS的对齐数是8,所以该成员的对齐数为4,因此i要对齐到4的倍数的地址处,即偏移量为4的地址处(4、5、6、7),而偏移量为1、2、3的地址处的空间就被浪费了。三个成员的最大对齐数为4,因此结构体的总大小应为4的整数倍,为8。
2024-04-23 20:57:34
154
原创 指针笔试题3
cpp[-1][-1]+1可转化为*(*(cpp-1)-1)+1,cpp-1后得到了c+2处的地址,解引用得到c+2,再-1变成c+1,解引用得到N的地址,再+1得到E的地址,向后打印得到EW,如图所示。*cpp[-2]+3可转化为**(cpp-2)+3,cpp-2后得到了c+3处的地址,解引用得到c+3,再解引用得到F的地址,再+3,得到S的地址,从S的位置向后打印,得到ST,如图所示。
2024-04-21 16:12:34
177
1
原创 指针笔试题2
a[4][2] - &p[4][2] 表示两个地址之间元素的个数,从上图可知为4,但题目为&p[4][2] - &a[4][2],因此以%d的形式打印出来是-4,而%p表示以地址的形式打印,而-4的十六进制数为FFFFFFFC。aa+1表示第二行的地址,解引用得到第二行,*(aa+1)又相当于aa[1],而数组名表示首元素的地址,因此ptr2指向的是第二行第一个元素的地址,即6的地址。int(*p)[4],p是一个数组指针,指向的数组有4个元素,每个元素的类型是int。
2024-04-17 18:49:58
124
原创 指针笔试题1
p+0x1,表示跳过一个结构体,结构体的大小为20个字节,因此是跳过20个字节,而地址在内存中的存储形式为十六进制,20的十六进制数为14,因此为0x100014。(int)a+1,a表示数值首元素的地址,将其强制类型转换成int,并加1,再强制类型转换成int*,存放在ptr2中,如图所示。&a取出的是整个数组的地址,&a+1跳过整个数组,表示的是数组后面一块空间的地址,将其强制类型转换成int*,并放在ptr中。&(a+1)表示数值后面一块空间的地址,将其强制类型转换成int*,并存放在ptr1中。
2024-04-11 20:10:20
303
1
原创 指针和数组笔试题2
4.sizeof(a[0]+1),a[0]作为数组名没有单独放在sizeof内部,也没有取地址,因此a[0]就是第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址,计算的就是地址的大小,为4或8。7.sizeof(&p[0]+1),p[0]表示的是第一个元素,&p[0]取出第一个元素的地址,加1表示第二个元素的地址,计算的是地址的大小,为4或8。8.sizeof(&a[0]+1),a[0]是第一行的数组名,&a[0]取出的是第一行的地址,加1就是第二行的地址,计算的是地址的大小,为4或8。
2024-04-08 21:21:20
311
原创 指针和数组笔试题1
复习:sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小;&数组名,数组名表示整个数组,取出的是整个数组的地址;除此之外,所以的数组名都是数组首元素的地址。
2024-04-05 18:39:18
1563
1
原创 C语言初阶笔记3
int price;//b4,b5,b6是全局变量int main()//b1,b2,b3是局部变量struct Book b1 = {"三体", 20, 123456};//初始化return 0;
2024-03-31 11:27:18
231
原创 C语言初阶笔记2
此时a=0,++b为前置++,先++再使用,因此b=3,为真,不再往后算,而a++又为后置++,所以最终结果为a=1,b=3,c=3,d=4。第一题,当某个表达式的结果为0(假)时,“&&”后面的表达式就不再计算,因为无论后面的结果如何,整个表达式的最终结果都为0。操作符分为:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构体成员。当表达式1的结果为假时,整个表达式的结果为表达式3的结果。2.&数组名,取出的是数组的地址。
2024-03-27 19:55:31
1669
1
原创 C语言初阶笔记1
第一种是正确的定义方式,系统会默认在abc的后面加上'\0',因此sizeof的计算结果是4(算上'\0'),strlen的计算结果是3(不算'\0),而第二种定义方式如果后面不主动加上一个'\0',系统不会自动加上,因此sizeof的计算结果是3,而由于strlen计算时找不到'\0',所以无法判断出什么时候结束,故输出的结果为一个随机值(15)。sizeof是一个操作符,计算的是类型或变量所占空间的大小,单位是字节(byte),而strlen是一个函数,计算的是字符串的长度,以'\0'为结束标志。
2024-03-24 17:01:14
762
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人