2017linux面试题整理

本文深入探讨了C语言中int与char类型转换的细节,解析了二维数组指针操作的微妙之处,并介绍了如何定义并使用返回函数指针的函数。通过具体实例展示了C语言编程中的常见陷阱及解决方案。

1、关于int和char转换问题

#include<stdio.h>

#include<string.h>
int main()
{
    char str[512];
    int i;
    for(i=0;i<512;i++)
        str[i]=-1-i;
    printf("%d\n",strlen(str));
    return 0;

}

解释:

因为在str的时候-1和是整数,默认按32位走,左边高地址,右边低地址

因为char只会读取一字节,只会读一字节

-1-0补码 1111 1111 1111 1111 1111 1111 1111 1111-0000 0000 0000 0000 0000 0000 0000 0000

结果str[0]=(补码1111 1111)-1

-1-255的时候,补码1111 1111 1111 1111 1111 1111 1111 1111-0000 0000 0000 0000 1111 1111

结果str[255]=(补码0000 0000)为0,因为存进char类型,所以变为‘\0'结束符号,所以最后strlen结果为255

2、关于二维数组问题

#include<stdio.h>
int main()
{
    int nums[5]={2,4,6,8,10};
    int *ptr=(int *)(&nums+1);
    printf("%d,%d\n",*(nums+1),*(ptr-1));
    return 0;
}

结果 4,10

&nums是代表整个数组的地址,所以进阶单位是整个数组长度

&nums+1就到达了10后面的一个位置

当*ptr=nums+1只是nums向后移动一个单位到达nums[1]

注意:&nums类型是int(*)[5]类型,要强制转换一下才可以

 int *ptr=(&nums+1)不用强制转换的时候仍然代表一个的是10后面的一个位置,但是最后结果时ptr-1是按照int的字节减去,所以此时进阶单位不是一个数组长度


3、返回函数指针的函数
#include<stdio.h>
#include<string.h>
    size_t q(size_t b)
    {
        return b;
    }
    size_t(*p(char *str))(size_t a)//返回函数指针的函数
    {
        printf("%s\n",str);
        return q;//*q就是变成了q(size_t b)来计算
    }
int main()
{
    char str[]="xiyoulinuxgroup";
    printf("%d",p(str)(strlen(str)));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值