您的位置:首页 > 编程语言 > C语言/C++

C语言的一些零碎知识

2014-10-13 21:13 246 查看

1.sizeof() 

1.求变量开辟空间的大小  sizeof(a)   2.求类型声明的变量开辟的空间大小  sizeof(int)  3.求常量需要的空间大小sizeof(65)

2. a强制转换的是a中值的类型   a本身类型不会改变

3.当不同类型的数据进行运算的时候会发生隐式转换

不同数据类型进行运算是时:  

 四个看齐  1.整型要向浮点型看齐  
                   2.float 向double 看齐    
                   3.短字节向长字节看齐
                   4.有符号向无符号看齐

4.c程序的执行过程:

1. 首先cpu把二进制的执行程序拷贝到内存的代码段   
2.然后cpu就会按照这个二进制的程序从main函数开始执行   
3.调用main函数会压一个main栈(变量a的空间就在main栈中),然后把2放到a的空间中  。 
4.接着遇到了调用func函数,这个时候会压一个(push)func栈  执行里面的代码 ,遇到return  func栈会出栈(pop,然后把func空间释放(交给系统内存),出栈也就是func函数调用结束,
5.然后执行func函数调用地方下面的代码;最后main函数中遇到了return,那么main栈出栈(会释放,main函数结束,整个程序结束)

5.局部变量与全局变量

                           作用域                             内存的位置                       什么时候释放 
局部变量:    包含它的{}中                     函数栈中                          函数调用结束 /函数栈释放
全局变量:    整个工程所有文件             数据段                             程序结束数据段才会释放

静态局部变量    作用域 : 从声明开始到包含它的{}结束;
                              内存:  在数据段  (注意  :不是在栈中 不会随栈消失而消失;) 在编译时执行(只执行一次)。

静态全局变量    作用域: 只能在当前文件(包含该变量的文件)内使用(如 main.m)
                              内存:在数据段

6.野指针;

1.指向一个非法空间(比如系统占用的空间)2、不知道指向哪里3.free(p) free之后的指针指向的空间不能再使用

7.&a(a是数组名)表示的意思

看下面的代码

int main(void)
{
//|XXXX|XXXX|XXXX|XXXX|XXXX|
int a[5] = {3,10,28,9,5};

int * p = (int *)(&a+1);
p--;
printf("*p = %d\n",*p);
return 0;
}</span>


输出的结果应该是 *p=5,

因为&a 是数组的地址,它的类型 int(*)[5]   ,&a+1  , +1 加了整个数组的大小,相当于1* sizeof(int [5]),所以&a+1 让指针指向了a[5]后面,p-- 后,p自然就指向a[5]了。

8.字符串相关函数

1.atoi();把字符串转化为int类型
2.strlen();统计字符串有效长度不统计尾零
3.strcmp();字符串比较
4.strcpy
把src所指由NULL结束的字符串复制到dest所指的数组中

5.strcat

把两个字符串拼接在一起,结果放在第一个字符串里
①第二个字符串带'\0'依次拼接到第一个字符串第一次出现的'\0'后面
②第一个参数必须指向一个合法的空间并且能够被修改切足够大空间

6.strstr

//字符串查找:在第一个参数指向的字符串中查找第二个参数指向的字符串    或者说查找子串在长串中的位置(从前向后第一次子串出现的位置)
  //返回值:找到子串 返回子串在长串中的位置   找不到返回NULL

9.const关键字

*前 const
const int *p;   // 限制*p不能被修改  p可以改
int const *p;   //同上
*后const
int *const p;   //限制p不能改,*p可以改
两个都有
const int *const p;// p和*p都不能改

10.结构体

struct 结构体名 {
成员变量1;
成员变量2;
成员变量3;

};

自定义了一个结构体类型   struct Stu ;
struct Stu {
char name[30];
int num;
double height;
int score;
}; //这个分号不能省略

结构体就是具有多个不同数据类型的集合,
结构体大小 跟系统位数和编译器有关
type struct _Range{
int location;
int length;

}Range;
//typedef  定义结构体的另外一种形式   给结构体struct  _Range   起别名叫Range

11.枚举

enum Sex{
    Male,
    Female
};
typedef struct Stu {
    char name[20];
    int num;
    int sex;
}Student;

12.宏

预处理
预处理 ------->   编译------->  汇编-------->    链接---

在预处理阶段 会处理 “#"开头的预处理语句

在于处理阶段  会把宏替换原来宏定义的后面的一串代码

1.无参宏
#indefine 宏名   一串代码
#indefine PI  3.1415926

2.带参数的宏
#define  SUM(x,y)  x+y

例:ret=SUM(1,2);<——————> ret=1+2;

#define MUL(x,y)   x*y;
ret=MUL(1+2,3+3);  <----------------->ret=1+2*3+3;

定义带参宏的宏  参数和整体都要加();
宏定义在同一行;
宏会使代码体积增大  函数不会
定义方式不一样
宏不会压栈
宏不检查类型  函数会检查
宏不能调用自己  函数可以
一个反斜杠‘\’,  在宏定义中 表示连接符  可以把多行的内容连接成一行

#if 0                     
printf("a");
printf("a");
printf("a");
printf("a");
#endif

#if 0 
语句块1;                    
#else
语句块2;
#endif
-------->条件编译    预处理阶段  如果值是非0值  那么执行语句块 否则不执行

#ifndef  宏名
语句块;
#endif
-----------------》 如果没有定义宏  显示语句块
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息