多个文件的时候,注意要给自己的函数加上static ,来限定仅仅是本文件内可以使用的函数。
静态全局也是同样的:仅仅在本文件中使用有效。
-----------------------第一天的C: C89 C99标准
1. int a;scanf("%d",&a); char arry[a];//unix下C是支持动态数组的。
2. gcc编译器需要我们加上空白行,以免在链接其他文件的时候和main文件的语句重叠,出错
3. #预处理语句会在编译之前执行展开。 \续行符号 $,_可以作为变量名 系统里面的变量名之所以有__很多个下划线是为了防止和我们定义的变量相冲突。
4. 变量释放了,系统仅仅是把该空间标记为“空闲”状态,里面的数据是不会晴空的,所以每定义一个变量都会存在垃圾值。
5. unix下的int 是4个字节的。与long int 一致 与float 一致。但还是float表示的数据大。
6. A--Z: 65--90 a--z : 97---122 '0'---'9': 48--57 \0: 0
7. sizeof()运算符仅仅只是作空间的探测,并不会执行其中的运算。直接无视你的存在。
8. '\0'== " " , 游离:表示存在中文符号。 lf llf f要对数据铭感,比如int的取值范围。
-------------第二天的C:
1.所有的地址都是常量,内存里面已经固定好了有多少地址。
2. string之所以要\0结束,是因为他只有开头,表示不了结束,所以必须要来个可以结束的标志,这样就可以让编译器不会一直往后猛找了,不会结束。int 4 double 8 char 1 string ? so \0 end . "abc"==&"abc":true
3. utf-8 中文3个字节,gb2312和gbk big5:中文占2个字节(国际,中国大陆,香港,台湾):英文和数字都统一占1个字节。
4. 栈空间的内存分配是:想定义后分配。倒叙:先进后出,必须有顺序。 堆空间:手工申请,手工释放,逻辑表现出有序,无需大块数据空间连续,空间存储是零散的。
5 . 函数的返回值,运算符运算出来的结果:系统都会先将结果保存到临时空间中去,然后再从临时空间中取值进行后续的运算操作。](所以复合运算效率高是减少了这一步)
6. 编译时候先分配空间,待所有变量空间分配完成了之后,再来执行,运行代码!
7 . time_t size_t off_t
--------------------第三天的C:
1. 为什么++++c会出错,因为++c执行的操作会到临时变量中去,++(临时变量),:额,这个必须错:临时变量怎么给自己自争阿?
2. 函数的行参调用都是从右自左的调用,这于栈空间的先进后出有关。
3. 多个 参数中都有对同一个变量的操作,那么系统会自动优化。 加上 volatile (要求寄存器和内存值必须同步)
4. 改变某个变量的位1 ->0 ,0 -> 1 .需要我们借助中间数,来进行位运算。
5. 1个字节:8位全1:255 2个字节16位全1:65535/2=3万 4个字节32位全满:42亿/2=21+ float:7位有效数,6位小数 double :16为有效数,15位小数
6. scanf()具有缓存,返回的是有效接受个数,遇到回车结束,printf()也具有缓存,返回的是有效字符的长度,遇到回车结束。\r表示回到当前行首。
fflush(stdin) fflush(stdout); while(getchar()!='\0'); cin.ignore(1000,'\0');
7. ^异或具有累加和还原的效果。 a=a^b;b=a^b;a=a^b; ************************8
8. usleep()微妙 sleep()秒 float double 通过这种方式来达到比较的效果:d-f>=0.0000001 d-f<=0.0000001 允许误差的范围是多少。
9. 小的数据在转换成大的数据时,会产生垃圾值;比如:float f===> double 时,会多出空间,这些空间中都是垃圾值,所以不具备准确性。
10. goto的标记后不要有定义语句,如果有应该在之前加上; tag: ; int a;goto tag;
11. memset(str1,'\0',10) memcpy(str1,str2,sizeof(str2)); *********************sizeof()是探测不出动态大小,只能作静态的,死的探测。************所得结果是1咯
----------------第四天的C:
1. file.close()只有关闭了,文件才写入到磁盘中去,因为没有close则东东,数据都是在内存中。
2. 全局的变量,可以声明多次,不算错! 栈空间具有全局作用域。
3. unix 下的动态调试工具:gdb a.out r运行 bt跟踪 q退出(重复释放同一个指针指向的空间会段错误)
4. fgets(str3,sizeof(str3),stdin):把stdin作为一个文件 if(str[end-2]!='\n'&& str[end-2]!='\0')while(getchar()!='\n');
fgets()用之前,清务必把str3的空间清0,方可景行判断。
5. 指针无法探测出其所指空间总共大小,而数组名可以。 windows下命令行中的字符最多259个。
6. void *p 默认1个字节 sizeof(p)
7. strstr() :查找字符串,返回其下标值 char* pp=strstr(str1,"cc"); if(NULL!=pp){...}
strcpy() strncpy(str1,str2,min(sizeof(s1)-1-strlen(s2),strlen(s2))) strcat()自动清0的去追加 strncat() put() putchar()
sscanf(html,"<htl> %s <htl> %d <name> ",str,num) sprintf(strNew,"%s and %d is a good friend!",str,num);
C++ istringstream iss(str) ,ostringstream oss; iss>> >>>> >> ; oss >> >> > ;cout<<oss.str()<<endl;
find(str1); length() ;substr();
--------------------------第5天的C:
1. 可变参数的实现: stdarg.h va_list va_start(list,size) va_arg(list,double) va_endl(list);
2.重点: static 函数,仅限制于本文件的使用。(解决了很多项目经历的难题。)
3.__LINE__ __FILE__ __DATE__ __TIME__ __STDC__
#define G 123 #undef G #define s #else #endif #ifndef xx #define xx #endif
---------------------------第6天的C:(指针)
1. 初始给NULL,防止野指针。 不能表示空间的整体占用,数组可以。 堆空间分配默认是void * . int* a,b; *仅仅对a起作用,仅一次作用。
2. calloc(4,3) 比malloc 多了一步初始化 ,同c++ :bzero(str,4)用于初始化0 memset(str,'\0',sizeof(str));
3. 地址运算具有放大因子和缩小因子,所以不用担心。 *p++ :同级别的运算符号,是从从右至左来运算的。
4. 数组名不可以自增运算,因为不是变量,指针变量才可以。
****************************************
5. 数组指针:int (*p)[3];指向数组的指针,是个指针。(*p可以表示一个一维数组) 所yi [][] 是二维数组。
指针数组: int *p[3] ; 每个元素存储的是指针变量的数组
指针函数: 是个函数,返回指针类型罢了。 int *p(int,float);//返回的空间应该是在堆的或者全局的空间中。 这是声明方式
函数指针: 是个指针, 指向函数首地址: int(*P)(int,float);//p=abc or p=&abc;
多极指针: int **p ; int *p2 p=&2;
********************************************
6. atoi() atof() ..... c_str(); 加上static 的全局变量仅仅在本文件中有效果。
----------------------------第7天的C:(结构,内存对其,位段)
1. C不支持struct内部存在函数成员,而C++则允许,所以同class一样贝。 C定义struct变量,要加上struct student s1的修饰,而c++则无需加上。
2. 不能用数组给另一个数组赋值,因为都是常量,怎么赋值?!
3. 内存对齐:加快处理速度,但是耗了内存。 1。 以类型最大的作为对齐单位,但是32位的机器,最多4个字节,超过了则以4个字节为对齐单位。2。连续数据类型内部不进行对齐 (同类型情况下)3。 能拼凑的,会按照首地址落在偶数位的原则来对齐。 4结构体的长度,一定是对齐单位的整数倍
4. 不同的平台的内存对齐具有差异,所以我们要去了解这些差异,才能配出跨平台的对齐方式。 位段: char ch:1; int in:22;只有整形才可以作位段的:操作。
----------------------------第8天的C:(文件操作)
1.
C :
FILE* file=fopen("","rb+");//r w a rb wb ab r+(更新,删除) w+ a+ rb+ wb+ ab+
if(NULL==file)return;
fputc(ch,file);
rewind(file);//回到开头位置 fseek(); ftell() feof() SEEK_SET SEEK_CUR SEEK_END fseek(file,-sizeof(s),);
while((ch=fgetc(file))!=EOF)putchar(ch);
if(0!=fclose(file))"无法关闭";
C++:
fstream f("abc.tst",ios::app|ios::in|ios::out);
if(!f)return;
f.read((char*)&s1,sizeof(s1));
f.seekg(-3*(off_t)sizeof(s),ios::cur);//seekp() ios::beg ios::end
f.wirte();
while(!f.eof()){read().....}
f.close();