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关键字
*前 constconst 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
-----------------》 如果没有定义宏 显示语句块
相关文章推荐
- 关于C语言的一些零碎知识
- TIPS2-记录一些零碎知识
- C语言零碎的一些注意事项(更新中)
- 黑马程序员--关于一些零碎的知识
- C语言中关于数组、指针以及函数的一些基本知识
- C语言的一些误用和知识总结
- 一些零碎VC知识
- C语言的一些小技巧 小知识
- C语言的数组、字符串等一些知识总结
- 关于CSS的一些零碎的知识(css hack,图片与文字对齐)
- C语言的一些知识
- C语言零碎的一些注意事项(更新中)
- IOS学习笔记——一些零碎知识
- 一些零碎的知识
- js的一些零碎知识积累
- VBA一些零碎知识
- C语言中一些比较基础而又重要的知识
- C语言中的一些小知识(《c语言入门经典》读书笔记)20120315
- 黑马程序员-- 一些零碎的知识
- C语言一些基本知识整理