C语言的一些零碎知识

来源:互联网 发布:欧陆风云4 for mac 编辑:程序博客网 时间:2024/04/30 15:53

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

-----------------》 如果没有定义宏  显示语句块





0 0