C语言的强符号和弱符号深入理解

在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号。
对于它们,下列三条规则使用:

① 同名的强符号只能有一个,否则编译器报”重复定义”错误。

② 允许一个强符号和多个弱符号,但定义会选择强符号的。

③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个。

mian.c中

#include <stdio.h>
#include <stdlib.h>

int x = 10;//强符号                                符号是global
int y = 10;

void test();

int main()
{
    printf("&x = 0x%x\n", &x);
    test();
    printf("%d\n", x);//0               //思考的地方
    printf("%lf\n", x);//0.000000       //编译器默认x就是整形的,就算打印lf也没用,相当于整形0强转为double的0
    printf("%d\n", y);//1077149696      //思考的地方

    double *p = &x;//直接取首地址 步长为8 的内存
    printf("%lf", *p);//20.000000   //这里就能正常显示test中x = 20

    system("pause");
}

func.c中

double x;//弱符号

void test()
{

    //x += 50;  //这里最好不用+= 因为原来的int x = 10 会被 10.0 覆盖 x的值就成了10.0 而且这里不是x变成了10.0,而是x与y共同的内存8字节
    x = 20;//这里x是main中的x,但是赋值的类型确实依据这个文件中的double
    printf("func:x = %d\n", x);//func:x = 0             //这里是正常的
    printf("func:x = %lf\n", x);//func:x = 20.000000    //这里是正常的
}
/*
当执行第7行之后,x的内存就发生了变化
00 00 00 00 00 00 34 40      一字节16进制显示
00000000 00000000 00000000 00000000 00000000 00000000 00110100 01000000  转化为 2 进制  
01000000 00110100 00000000 00000000 00000000 00000000 00000000 00000000  因为是小端字节序,所以我们重新排序  注意:01000000 00110100 00000000 00000000 刚好等于1077149696
0 10000000011 0100000000000000000000000000000000000000000000000000  第一位 正负  2-12位 指数  13-64 小数
0 1027 - 1023 0100000000000000000000000000000000000000000000000000  
0 4           0100000000000000000000000000000000000000000000000000      最终变化
1.01*2^4 = 10100 = 20   计算结果
*/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值