我们很容易忽略的常用c语言知识

来源:互联网 发布:淘宝店主培训 编辑:程序博客网 时间:2024/05/17 12:48
我们很容易忽略的常用c语言知识
****************************************************************************************************
struct space{
int a;       //4字节
char b;    //4字节
float c; //4字节
double d; //8字节
}haha;
请问space占用多大空间呢?
sizeof(haha)的结果是20;
如果是这样呢
#include<stdio.h>


struct space{
char a;
//int b;
//float c;
double d;
}haha;
int main(){
printf("%d\n",sizeof(haha));
}
结果是12;不管怎么样知道c语言帮你做了数据对齐操作就可以,char型的数据会自动变为4,8的倍数
例如char a[5],那么它实际占的空间为8知道就可以了(当然编译器不一样,其结果也是不一样的)


其实我们还有一种struct写法


struct space{
int a:2;
int b:2;
}haha;


C/C++语言的结构体支持对其中的基本成员变量按位拆分;
****************************************************************************************************


c语言中没有bool或者BOOLEAN,c语言默认0是假,大于0的数为真,那我想用怎么办呢
#include<stdio.h>
#include<string.h>


typedef int bool;        //typedef自定义数据类型
enum{false,true};     


static char s[20]={0};
bool fun(){
if(gets(s) != NULL)
return true;
else
return false;
}
int main(){
if(fun()){
printf("%s\n",s);
}
}
****************************************************************************************************


我们常用的宏定义
1,防止一个头文件被重复包含 


#ifndef COMDEF_H 


#define COMDEF_H 


   //头文件内容 


#endif 
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。 


typedef   unsigned char       boolean;      /* Boolean value type. */ 
typedef   unsigned long int   uint32;       /* Unsigned 32 bit value */ 


3,得到指定地址上的一个字节或字 


#define   MEM_B( x )   ( *( (byte *) (x) ) ) 


#define   MEM_W( x )   ( *( (word *) (x) ) ) 


4,求最大值和最小值 


    #define   MAX( x, y ) ( ((x) > (y)) ? (x) : (y) ) 


    #define   MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) 
    
5 返回一个比X大的最接近的8的倍数 


#define RND8( x )        ((((x) + 7) / 8 ) * 8 ) 


6,将一个字母转换为大写 


#define   UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) ) 


7,判断字符是不是10进值的数字 


#define   DECCHK( c ) ((c) >= '0' && (c) <= '9') 
8,判断字符是不是16进值的数字 


#define   HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\ 


                        ((c) >= 'A' && (c) <= 'F') ||\ 


((c) >= 'a' && (c) <= 'f') ) 


9,防止溢出的一个方法 


#define   INC_SAT( val )   (val = ((val)+1 > (val)) ? (val)+1 : (val)) 


10,返回数组元素的个数 


#define   ARR_SIZE( a )   ( sizeof( (a) ) / sizeof( (a[0]) ) ) 


11  宏中"#"和"##"的用法 
一、一般用法 
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. 
用法: 
#include<cstdio> 
#include<climits> 
using namespace std; 


#define STR(s)      #s 
#define CONS(a,b)   int(a##e##b) 


int main() 

     printf(STR(vck));            // 输出字符串"vck" 
     printf("%d 
", CONS(2,3));   // 2e3 输出:2000 
     return 0; 



A N S I标准说明了五个预定义的宏名。它们是: 


_ L I N E _ 


_ F I L E _ 


_ D A T E _ 


_ T I M E _ 


_ S T D C _ 


****************************************************************************************************
自己写的程序结果很惊讶


#include<stdio.h>
#include<string.h>


int main(){
int i;
char *str="abcdef";
int p[0] = {1,2,3};
p[33] = 3;

char visit[5]={0};
visit[str[2]]=3; //visit[99] =3
printf("%c\n",str[2]);  //打印字母c
printf("%d\n",str[2]);  //打印数字99
printf("%o\n",visit[str[2]]);//打印数字3
printf("%d\n",p[33]);

printf("%d\n",sizeof(str));//打印4,指针大小为4
printf("%d\n",strlen(str));//打印6

 char s[80];
 memset(s,0,sizeof(s));
 printf("%d\n",sizeof(s));//打印80 , 可以看出s是地址不是指针,只有作为参数传递时,才看成指针
 printf("%d\n",strlen(s));//打印0

return 0;
}


记住编译器不会检查数组越界的情况


****************************************************************************************************
持续中.................................