前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >寒假提升(6)[杂烩典型题]

寒假提升(6)[杂烩典型题]

作者头像
薛定谔方程难
发布2024-02-11 08:55:50
930
发布2024-02-11 08:55:50
举报
文章被收录于专栏:我的C语言我的C语言

天可补,海可填,南山可移。 日月既往,不可复追。 ——曾国藩

1、关于整形提升

代码语言:javascript
复制
char a=101;
int sum=200;
a+=27;
sum+=a;
printf("%d\n",sum);

这段代码的结果是什么呢? 首先关于char,存储的时候是是一个字节,意味着的是最高只能是2的7次方-1。为什么是7次方呢? 因为char是有符号的类型,符号位占了一个字节,也就还剩下127为最高,最小为-128。 此外,127和-128其实是连在一起的,意思是,对于char或者是别的一些有符号的类型也相当于是这样的,从0开始一直加1,能到127,在加上1就会变成-128,然后再加,最后又到0。 所以,a=101加上27,变成的是相当于-128,存储方式是1000 0000作为补码存储再内存中,符号位是1。但是在和int类型的sum进行计算时会整型提升(可以点进去看看,里面有相关介绍),此时由于最高位置是1,所以高位补1,然后再取反+1。为-128,所以sum+=a为sum=200-128=72。

2、大小端

关于大小端的判断方法,有两种。 一种是地址的强制转换,反正强制转换的话,会从低地址来取地址。 还有一种方法就是,利用联合体,利用它的存储的特点来判断。 关于细节和实现的操作,这里有,请点击 那么,这样的话,知道了大小端,这题应该会好些点。

代码语言:javascript
复制
int value = 1024;
char condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
if(condition) value += 1; condition = *((char*)(&value));
printf("%d %d", value, condition);

问:最后的结果是什么? 1024的二进制是:0000 0000 0000 0000 0000 0100 0000 0000 注意: * ((char * )(&value)),这句话的意思是获得value低地址的8为数据,若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的8位0,则condition=0,不执行两个if语句,则value不变,还是1024;若数据是采用小端存储方式,则低地址对应的是数据的低位,即最右边的8位0,则 condition=0,不管是大段还是小段,结果都是一样的,都是取全部是0。

3、使用函数时参数的影响

3、1、计算大小(有函数存在)

代码语言:javascript
复制
void func(char para[100])
{
void *p = malloc(100);
printf("%d, %d\n", sizeof(para), sizeof(p));
}

此时,printf的结果是什么呢? 对于char para[100],来说,传到函数中的时候已经发生了改变,传参的时候也只是会传首元素的地址。所以在计算的时候,两个的结果都是4(32位下的指针的大小)。

3、2、计算大小(无函数存在)

在64位操作系统上,下面程序返回结果是?

代码语言:javascript
复制
int main()
{
int *k[10][30];
printf("%d\n", sizeof(k));
return 0;
}

此时的大小不再指的是指针,因为这个结构,是指针数组,那么计算的就是这个数组的大小,然后呢,数组中存储的是指针,再64位上,指针的大小是8个字节,然后这个函数指针,存储了300个指针,所以结果是2400个字节。

3、3、形参和实参

代码语言:javascript
复制
#include <stdio.h>
void func(char *p) { p = p + 1; }
int main()
{
char s[] = {'1', '2', '3', '4'};
func(s);
printf("%c", *s);
return 0;
}

==在调用的时候,创建的只是形参,形参对于原来的实参的拷贝,在函数中的参数,他们的生命周期只会在函数中,离开函数,就会销毁。==所以,p的改变不会对s的指向没有什么影响。这和链表中还是有区别的。

4、关于赋值

若有定义语句: char s[3][10],(*k)[3],*p; 则以下赋值语句错误的是? 1.p = s; 2.p = k; 3.p = s[0]; 4.k = s; 下面哪些是错的? 在没有强制类型转换的情况下,只有类型完全相同的指针才能相互赋值。

char s[3][10]中s运算时会退化为数组指针,类型是char ( * ) [10]。

char ( * k)[3]很明显k就是一个数组指针,类型也为 char (*)[3]

char * p类型为char * 指针

s[0]代表二维数组第一行,此时运算时,会退化成为第一行的首元素的地址。 所欲对于答案来说,答案是124。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、关于整形提升
  • 2、大小端
  • 3、使用函数时参数的影响
    • 3、1、计算大小(有函数存在)
      • 3、2、计算大小(无函数存在)
        • 3、3、形参和实参
        • 4、关于赋值
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档