C面试题(二)

沙场上才能训练出能战斗的士兵。时间久了,需要回炉。做题能力思维没有了,有点缺乏思考深入动脑筋。

1、关于float 与零值比较

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

int _tmain(int argc, _TCHAR* argv[])
{
	float f = 1.0;
	float f1 = f / 3.0;
	float f2 = f1*3.0;

	float fout = f - f2;

	printf("f1:%lf\r\n",f1);
	printf("f2:%lf\r\n",f2);

	printf("fout:%lf\r\n",fout);

	float f_f, f_f1, f_f2, f_f3;;
	f_f = 65.02;
	f_f1 = 65;

	f_f2 = f_f - f_f1;
	f_f3 = 0.02;

	if (f_f2 > f_f3)
	{
		printf(">\r\n");
	}
	else if (f_f2 < f_f3)
	{
		printf("<\r\n");
	}
	else
	{
		printf("=\r\n");
	}


	if ((f_f2 >= -0.02) && (f_f2 <= 0.02))
	{
		printf("float in\r\n");
	}

	printf("big data:%f-%f = %f ,%f\r\n",f_f,f_f1,f_f2,f_f3);
	f_f = 63.02;
	f_f1 = 63;
	f_f2 = f_f - f_f1;
	printf("small data:%f-%f = %f ,%f\r\n", f_f, f_f1, f_f2, f_f3);

	printf("The Numbers of bit are different\r\n");
	system("pause");
	return 0;
}

这个实际很难这样应用,咋看一脸懵逼。注意一点存储格式是不一样,代表的位数和精度是不一样的。

推荐:http://blog.csdn.net/u014596240/article/details/44684501

2、指针定义的区别

char * const p; char const * p const char *p 

解答: 

char * const p; //常量指针,p的值不可以修改 

char const * p//指向常量的指针,指向的常量值不可以改 

const char *p //char const *p 

指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变。常量指针
是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。
指针常量强调的是指针的不可改变性,而常量指针强调的是指针对其所指对象的不可改变性。
注意:无论是指针常量还是常量指针,其最大的用途就是作为函数的形式参数,保证实参在被调用
函数中的不可改变特性。 

3、数组指针地址操作的理解

main() 

{

int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); 

printf("%d,%d",*(a+1),*(ptr-1)); } 

输出:2,5 

*(a+1)就是a[1]*(ptr-1)就是a[4],执行结果是2

&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5int int *ptr=(int *)(&a+1); 

ptr实际是&(a[5]),也就是a+5 原因如下: 

&a是数组指针,其类型为 int (*)[5]; 

而指针加1要根据指针类型加上一定的值, 不同类型的指针+1之后增加的大小不同 

a是长度为5int数组指针,所以要加 5*sizeof(int) 所以ptr实际是a[5] 

但是prt(&a+1)类型是不一样的(这点很重要所以prt-1只会减去sizeof(int*) 

a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]. 


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

int _tmain(int argc, _TCHAR* argv[])
{
	int a[5] = {1,2,3,4,5};
	int *ptr = (int *)(&a + 1);

	printf("%d-%d\r\n",*(a+1),*(ptr-1));

	ptr = (int *)(a + 1);
	printf("new:%d-%d\r\n", *(a + 1), *(ptr - 1));

	printf("new sequence:%d-%d\r\n", *(ptr + 1), *(ptr++));
	system("pause");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值