前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【一】曾经那些错误,你又踩坑了吗?

【一】曾经那些错误,你又踩坑了吗?

作者头像
The sky
发布2023-04-12 14:50:56
2040
发布2023-04-12 14:50:56
举报
文章被收录于专栏:C++的逆袭之路

巩固基础和不断练习,我们才会进步!这一期开始,我们就要看看我们之前的学过的知识到底掌握了没有,再通过练习去巩固! 



一、for循环

初始化部分只在进入循环时运行一次!

例题1:

 看for循环执行次数,那就是要看条件判断部分,y=123 &&x<4,y=123恒为真,x<4只在x从开始的前四次小于4为真,所以执行次数就为4

例题2:

我们先看了解 getchar(); getchar就是在缓冲区中拿一个字符。         ch=getchar()!='\n',就是将缓冲区的值拿出来赋给ch,在判断等不等于'\n'         getchar()!='\n',判断从缓冲区拿出字符等不等于'\n' 是不是乍一看都是对的啊?? 但你仔细发现D那不就错了!刚刚我们说过,for循环的初始化部分只执行一次,那你这不是只拿了一次,然后一直在比同一个吗?

二、指针有关内容

1.*(解引用)和其他运算符

 在我们了解了运算符的优先顺序以后,那么例子就来了:

 A: p会先和*结合,先解引用,1009+=1,可以!  B:当然括号优先级最大,(*p)++;1009++,可以!  C:++(1009),当然可以! 前置++:先加再使用;后置++,先使用再加  D:*p++,会先和++结合,*(&p++),那肯定就不行了,不可以!

2.指针变量的移动

数组名就是数组首元素的地址 &数组名就是整个数组的地址,差别体验在向后移动 ptr=&a+1,整个数组的地址+1

*(ptr-1)此时向后移动一个单位(四个字节),指向4。 

这个题和上边的是非常相似的:

a为首元素地址,所以选C

3.二维数组

int (*p)[3]是数组指针,指向类型为int且元素个数为3的数组 二维数组的数组名是首元素地址:

*(p+0)就相当于p[0],*(*(p+0)+0)就是p[0][0] p[0][0]是第一行第一个地址的值,即为n[0][0],也就是10; p[0]是第一行的地址,p[0]+1就代表在这一行偏移一位,*(p[0]+1)等价于p[0][1],也就是20; *p等价于*(p+0),也就是p[0],所以(*p)[2]等价于p[0][2],也就是30; B

a[i]相当于 *(a+i) a[i][j]相当于*(*(a+i)+j);以此类推! B

 每个元素占一个存储单元,说明都是char类型; 现在已知x[9][9] 地址为 0xf8b82  21c;               x[4][4] 地址为 0xf8b82  140;               求x[7][7]的地址 那我们必须知道之间相差多少个元素,一行的元素有多少: 为了好算,我们统一:x[4][9]= ....145,x[9][9]=...21c,那么相减就是中间5行的个数,21c-145(16进制计算)=D7(16进制),转化为10进制D*16+7=208,208/5=43,一行就有43个元素。 所以:x[7][7]就可以由x[9][7]减去2*43=86(10进制),相减转化为16进制=56 21A-56=1c4.所以答案为A

首先看到**a[3][4],下意识就要想到,会与方括号先结合,那么就是二维数组,共有12个元素,每个元素的类型是 **指针类型,12*4=48

 三、逻辑运算符

我们看到这样的代码,首先得有else就近匹配,就会让代码更容易看

第一个if语句执行时,a=1,b=2为真,执行后,a=1,b=3; 第二个if语句b!=2为真,但此时重要的一点是,逻辑运算符具有短路效应,||左边为真时,右边将不会执行。(同理,&&左边为假时,也不会执行右边) 所以printf打印时,a=1,b=3,c=3;

四、存储方式,输出格式

1.输出格式

整型数据表示格式: 八进制:0123(0开头)零 16进制:0x开头 0x123 输出8进制:%o;输出16进制:%0x;

所以,m原本就是8进制数,八进制输出就是123;但n是10进制数,需要转化为8进制成173 2. 

 printf("%%%%\n"); 输出结果是 %% 3.

 4.

-为左对齐

 2.存储方式

此题涉及到大小端: 大端(字节序)低位在高地址,高位在低地址; 小端(字节序)低位在低地址,高位在高地址;

五、const修饰指针变量

做这个题目之前,我们先回顾一下:

 所以:const在*前面,就是修饰的指针变量所指向的值不能改变,叫常量指针             const在*后面,修饰的指针变量不能改变(即内存地址不能改变),就叫指针常量 所以选D,A选项是都不可以改变

六、与字符串有关的

strcpy(源地址,目的地址),把目的地址字符串拷贝到源地址; strcat(源地址,目的地址),把目的地址字符串追加到源地址; p2+1->"BCD";p1+2->"cd";str+2->"z"; strcpy(str2+2,strcat(p1+2,p2+1));-> "xycdBCD" 选D

a数组的元素类型都是char*,p是二级指针,a作为数组名,是首元素的地址(char**),所以将a赋值给p; 调用函数,m也指向数组a的首元素,++m从第一个元素到了第二个元素"afternoon",输出afternoon 

七、求结构体的内存大小(内存对齐)

先看内存对齐规则: 结构体内存对齐规则 1. 第一个成员在与结构体偏移量为 0 的地址处。 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS 中默认的对齐数为 8 3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。 4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

 以此类比,答案为C

位段:就是在结构体成员后面加了一个冒号和一个数字,数字代表:分配了几个比特位 位段意义在于节省空间 位段成员的类型必须指定为unsigned或int类型。

 同类型可以共用,但是不同类型需要重新开辟空间 unsigned:开辟4个字节,32位,a和b占用(19+11=30)此时开辟的空间只剩2个比特位;重新开辟四个字节,c占4个比特位,d占29个,加起来超过32,所以还需要再开辟 重新开辟4个字节 此时char属于另一种类型,需要独自开辟一字节 共13字节,但需要对齐,类型中最大的整数倍:16

八、功能型(观察)

 首先我们看到这么大的数,先用小的数来观察这段代码的功能:

 所以我们只需要观察9999的二进制中有多少1就可以: 9999转化二进制:1111100111 ;count=8

 总结

很多细小的问题我们得注意,回看慢慢进步!我们下期不见不散

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、for循环
  • 二、指针有关内容
    • 1.*(解引用)和其他运算符
      • 2.指针变量的移动
        • 3.二维数组
        •  三、逻辑运算符
        • 四、存储方式,输出格式
          • 1.输出格式
            •  2.存储方式
            • 五、const修饰指针变量
            • 六、与字符串有关的
            • 七、求结构体的内存大小(内存对齐)
            • 八、功能型(观察)
            •  总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档