基本的数据类型:
整型
浮点型(单精度、双精度)
在c语言中,所有的变量声明必须在任何执行语句之前(对当前域来说), 否则编译的时候会出现变量是未声明的标识符的错误。
main 入口参数:argc 和 argv
#include <stdio.h> void main (int argc, char **argv) { int i; printf("argc:%d ",argc); for (i=0; i<argc; i++) printf("argv[%d]: %s ",i,argv[i]); return ; }
argv的第一个是应用程序名称。
各种数据类型的大小:
其中long double在有些地方是10个Byte
- sizeof类似于宏定义的作用,其生效是在编译程序的时候,由系统计算给相关变量分配的空间,不同的分配方式(动态分配,静态分配;以及字节补齐,都会影响最终结果)
- 为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
- 总的原则是在保证存储速度的情况下,尽量缩减数据的存储空间,所以对齐是选择系统要求和数据类型本身要求中较小的一个。(struct的对齐按照,其中最大的对齐元素来算)
- 数据的起始地址按照当前数据的对齐要求进行,整个struct的最后补齐字节数根据其中虽大对齐要求进行
sizeof
函数 对应的是返回值
数组变量作为参数传入函数,对应的是将数组的指针变量传入函数体,sizeof(数组名) 仅仅是指针变量的大小
将指针变量传入函数,在函数体内可以处理指针变量 或者 通过*找到对应的数组对象。
static 分配的变量 sizeof不会处理
系统的Big-endian和Little-endian:
计算机中存储数据是按照字节,从低地址向高地址存储,在大端模式中是将数据的高字节存放在低地址,在小端模式中是将数据的低字节存放在低地址。
volatile的使用:
volatile 告诉编译器变量i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用。
在底层编程中许多地址并不是程序中的逻辑地址,而是硬件中真正的物理地址,对应的可能是各种功能寄存器、存储器,这些都是跟外界物理世界向相联系的,
即使在程序中没有更改相应变量的值,对应的寄存器中的值很可能也会被别的过程改变,所以实时更新变量 的值是很重要的。
(详细参考:http://www.cnblogs.com/chio/archive/2007/11/24/970632.html)
数据类型的转换:
指针类型的数据在声明的时候可以直接使用int数据赋初值,但是在执行语句的时候不能如此,vs会检查数据类型。
字符串处理
从文件完整路径中找到文件名:使用函数char* strrchr(char*, char); 能够找到从右边开始字符串中出现指定字符的位置,并将包括其在内的后面部分字符串返回。
char path[64] = "c:/dir/filename"; char *file; file = strrchr(path, '/'); if (file) printf("%s ", file);
与此相似的函数strchr()是从左边开始查找。