- 博客(55)
- 收藏
- 关注
原创 十五、数组和指针笔试题解析
就是跳过一行也就是第二行的地址,对第二行的地址进行解引用实际上就相当于拿到了第二行的数组名,也就是说。由于两边的类型是一样的,所以这里进行强制类型转换是没有意义的,只是起到干扰的作用,是第一行的数组名,而数组名又是首元素的地址,所以就相当于把第一个元素也就是。表示的就是第二个元素的地址,对地址进行解引用,所以第一个输出的值为2.的形式打印,输出的结果就是从第四个字母开始的字符串,也就是。的形式打印,输出的结果就是从第四个字母开始的字符串,也就是。类型的指针数组中时,存放的实际上是首字符的地址,所以数组。
2023-09-27 16:29:04
207
21
原创 十四、指针(三)
上述代码中,其实是一次函数声明,声明的 signal 函数有2个参数,第一个参数是 int 类型,第二个参数是函数指针类型,该函数指针指向的函数参数是 int 类型,返回类型是 void,signal 的返回类型也是一个函数指针,该函数指针指向的函数参数是 int,返回类型是void。不过转移表也有自己的局限性,由于转移表的实现依赖于函数指针数组,而放在这个数组的元素的类型必须是相同的,也就是说放在函数指针数组中的函数的参数和返回类型必须是一样的。那么二维数组的首元素就是第一行,是一个一维数组。
2023-09-25 18:31:54
168
14
原创 十三、指针(二)
从调试结果可以发现, a 和 b 创建在 main 函数的内部,a 的地址是 0x005efbfc ,b 的地址是 0x005efbf0 ,在调用 Swap1 函数时,函数在内部创建了形参 x 和 y 接收 a 和 b 的值,但是 x 的地址是 0x005efb18 ,y 的地址是 0x005efb1c。上述代码虽然能够正常运行,但是test函数返回的是局部变量n的地址,当test执行完毕的时候变量n的空间就被释放了,此时如果把n的地址传给p,后续再通过p赋值的时候就会造成非法访问。
2023-09-22 08:45:50
159
6
原创 十一、操作符详解
16进制的每一位数字都是0~9、A~F,各自写成2进制,最多有4个2进制位就足够了,所以2进制转16进制时,从2进制序列中右边低位开始向左每4个2进制位就换算成一个16进制位,剩余不够4个2进制位的直接换算。8进制的每一位数字都是0~7,而数字0~7各自写成2进制最多有3个2进制位就足够了,所以2进制转8进制时,从2进制序列中右边低位开始向左每3个2进制位就换算成一个8进制位,剩余不够3个2进制位的直接换算。逗号表达式中的表达式从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
2023-08-13 22:18:23
159
9
原创 十、函数栈帧的创建和销毁
之所以上面的程序会输出“烫”这么一个奇怪的字,正是因为 main 函数调用时,在栈区开辟的空间的其中每一个字节都被初始化成0xCC,而 arr 数组是一个未初始化的数组,恰好就是在这块空间上创建的,0xCCCC(两个连续排列的0xCC)的汉字编码就是“烫”,所以0xCCCC被当作文本就是“烫”。在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数组压入栈中(入栈,push),也可以将已经压入栈的数据弹出(出栈,pop)。代码执行到 Add 函数的时候,就要开始创建 Add 函数的栈帧空间了。
2023-08-13 22:09:27
161
10
原创 九、函数递归
如果函数不返回,函数对应的栈帧空间就一直被占用,所以如果函数调用中如果存在递归调用,每一次递归函数调用就都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。可以看到,当输入50时,需要很长时间才能算出结果,这也说明递归的写法是非常低效的,可以发现,在展开的过程中,递归的过程中会有重复计算,而且递归层次越深,冗余计算越多。事实上,许多问题可以以递归的形式进行解释,这只是因为它比非递归的思路更加清晰,但是这些问题采用迭代实现的效率往往比递归实现的效率要高。
2023-08-13 22:03:02
119
7
原创 八、VS实用调试技巧
当发现程序中存在的问题的时候,那下⼀步就是找到问题,并修复问题。 这个找问题的过程叫称为调试,英文叫debug(消灭bug)。 调试⼀个程序,⾸先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离和屏蔽代码的方式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码, 重新测试。
2023-08-13 21:59:02
175
9
原创 七、数组和函数实践:扫雷游戏
使⽤控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋盘是9*9的格⼦ 默认随机布置10个雷 可以排查雷 如果位置不是雷,就显示周围有几个雷 如果位置是雷,就炸死游戏结束 ◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束
2023-08-07 23:51:56
320
7
原创 六、函 数
ret_type fun_name(形式参数) {• ret_type 用来表示函数计算结果的类型,有时候返回类型可以是 void ,表示什么都不返回。• fun_name 是函数名,函数名尽量要能够反映函数的功能。• 括号中放的是形式参数,函数的参数也可以是 void ,明确表示函数没有参数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。• {}括起来的是函数体,用来实现函数的计算过程。
2023-08-02 20:43:16
139
7
原创 五、数 组
注意:变长数组的意思是数组的大小可以使用变量来指定,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的,数组的大小一旦确定就不能再变化了。从输出的结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。⼀维数组元素都是内置类型的,如果把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。
2023-08-02 20:38:58
152
2
原创 四、循环语句
首先执行 表达式1 初始化循环变量,接下来执行 表达式2 的判断部分, 表达式2 的结果如果 ==0,则循环结束;=0则执行循环语句,循环语句执行完后,再去执行 表达式 3 ,调整循环变量,然后再去 表达式2 的地⽅执行判断, 表达式2 的结果是否为0,决定循环是否继续。for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。
2023-07-28 21:53:46
214
3
原创 三、分支语句
上面的代码排版,让 else 和第⼀个 if 语句对其,让人以为 else 是和第一个if匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 自居,打印 haha ,但实际上 else 是和第而个 if 进行匹配的,这样后边的 if…if语句为真,则打印成年了,if语句为假,则不打印,对于 printf(“可以谈恋爱了\n”),它是独立存在的,不管if语句的条件是否为真,都会被执行。在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果是非0,则语句执行。
2023-07-28 21:38:43
339
7
原创 二、C语言数据类型和变量
(1)内置类型:C语言本身就具有的类型(2)自定义类型:本身不具有,可以自己创建的类型,比如可以创建描述学生的类型。
2023-07-28 19:57:26
286
5
原创 一、C语言常见概念
C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键字。• 关键字有特殊的意义,用于保留给C语⾔使用;• 程序员在创建标识符的时候不能和关键字重复;• 关键字不能自己创建。C语言的32个关键字如下:注:在C99标准中加⼊了 inline 、 restrict 、 _Bool 、 _Comploex 、 _Imaginary 等关键字。
2023-07-27 21:46:05
409
23
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅