C语言学习--一些细节问题

1.为什么指针站4byte?

在32bit系统中,指针占4byte;在64bit中指针占8byte;

解释:1.指针是int类型的,32bit中int是4byte的,所以指针是4byte的;

             2.32bit系统的内存寻址空间是2^32;所以用4byte=32bit的空间去映射机器的内存地址。

2.float的精确度是8位,为什么与‘零’比较时 0.00001只是5位?

解释:1.根据需求确定要达到的精度误差就行了。 比如你的误差允许范围为千分之一,那和0.0001比较就好了。

            2.x==0.0f也可以直接实现。


3.指针函数:是指带指针的函数,即本质是一个函数。函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。

    如:int *pfun(int, int);

   函数指针:因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。

int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
注2: 函数括号中的形参可有可无,视情况而定
  
    函数指针作为参数:int getmax(int i,int j,int k,int (*p)(int ,int)); 使用:ret=getmax(i,j,k,get_big);只需要传入函数名作为函数首地址指针就行了。
   返回函数指针的函数:int (*get_funtion(int a))(int  i,int j);
                                           int (*p)(int ,int);
                                           p=get_funtion(100);// 这里的get_funtion(100)仅仅作为函数名,将函数的返回指针的值作为另一个函数的首地址,
                                           max=p(i,j);

4.内存对齐可以用一句话来概括:

“数据项只能存储在地址是数据项大小的整数倍的内存位置上”

例如int类型占用4个字节,地址只能在0,4,8等位置上。

理论上是需要在物理内存上的位置是k的整数倍,但是分析的时候使用默认从1开始计数。

不同编译器中的k:
1、对于microsoft的编译器,每种基本类型的大小即为这个k。大体上char类型为8,int为32,long为32,double为64。
2、对于linux下的gcc编译器,规定大小小于等于2的,k值为其大小,大于等于4的为4。

这里不用管这个,只需要考虑最大的一个类型对其就可以了。由于字符数组中每一个元素都是1byte,因此可以讲字符数组元素拆分出来对其,只要保证最后结果是最大类型的整数倍就行了。

struct xx{
        char b;
        int a;
        int c;
        char d;
};

sizeof(XX)=16;

struct xx{
        char b;

        char d;

        int a;
        int c;
};

sizeof(XX)=12;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值