沙场上才能训练出能战斗的士兵。时间久了,需要回炉。做题能力思维没有了,有点缺乏思考深入动脑筋。
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,5
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int) int *ptr=(int *)(&a+1);
则ptr实际是&(a[5]),也就是a+5 原因如下:
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值, 不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 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;
}