全局变量加static不能被其他文件调用,只能本文件私有。
数组元素个数sizeof(array)/sizeof(array[0])。
冒泡排序:每次内循环冒出最大/最小的数;选择排序:每次内循环找到最小值位置,然后交换。
函数调用中,sizeof(形参)答案一直为4,形参只是指针地址,4个字节。
指针强制转化:int *p=a;char *pc=(char*)p;将p强制转化为char型,pc只能取一个字节,p能取四个字节。
getchar();使用之前清理内存用fflush(stdin)。
scanf(“%s")不能接收空格,gets(s)可以接收空格。
strcopy(a,b)将b复制给a,b必须有结束符;strcat(a,b)将b添加到a上,a,b必须有结束符,字符串加长函数;strtok(s," ")拆分字符串,截断字符串。
类型转化函数:sprintf()数字转换为字符串;atoi()将字符串转换为数字。
指针表示数组元素:纯指针法:*p,循环时用++p;纯下标法:p[i]循环时用++i;半指针法:*(p+i)循环时用++i;纯下标法与半指针法使用时,指针指向的地址一直没变。p[i]等价于*p(i)。
双引号之间的内容都指向常亮区,*p="abcd"; p[0]='a'; 崩溃。
数组使用{}大括号清零时只能在定义时使用。
头文件中:不可以放变量的定义;不可以放全局函数变量的定义,可以放全局函数和全局变量的声明;可以放结构体体定义。
void * 函数必须返回一个地址。
指针p指向一个地址,*p则为指向东西的数值,为所指向东西的代名词,相当于别名。
函数中,输出型参数必须使用指针变量,不然改变不了实际参数数值,
C语言中,memset(&s,0,sizeof(s)),对s字符串内存用0填充,#include<memory.h>。
memcpy(&i,&j,sizeof(int)));将 j 复制给 i 。
指针变量指向结构体时,调用变量(*p).xxx用 简化。
结构体做参数时,建议用指针。
局部变量结构体不初始化时,缺省为cccc;初始化清零时 ,用大括号sstruct ={ 0 };用memset(&s,0,sizeof(s));清零;全局定义结构体时,不初始化缺省为0。
结构体中数组变量初始化赋值用strcpy #include<string.h>
输出型函数必须用指针*p做形参。
system("cls");清理屏幕函数。
void swap(int a,int b){t=a;a=b;b=t;}不能交换变量,错误;
void swap(int *p1,int *p2){int p=*p1;*p1=*p2;*P2=p;}可以交换变量,正确;
void swap(int *p1,int *p2){int *p=p1;p1=p2;p2=p;}形参指向的地址改变了,变量没变,错误。
main函数中,结构体不初始化缺省为0xcc,全局去不初始化缺省为0x00。
头文件中,函数声明、变量声明、常量声明/定义、结构体声明/定义可以放;函数体、变量定义不可以放在头文件中。
fopen打开文件,fclose关闭文件,fread读取文件,fwrite写入。
system("pause");
#include PI 3.1415926 常量定义,无分号。
typedef unsighed int size_t;对类型重新定义,后面有分号。
#include时,系统头文件用< >,自己写的头文件用" "。
常量定义方式有#define,const,enum。其中,enum可以连续定义多个。
enum EMUM
{ i=10,j,k,
};
没定义数字时,以0为起点,其余变量依次加1。
定义时,enum ENUM e=SIZE;
枚举变量大小与整型变量相同,与成员列表个数无关;枚举变量只限制列表中的常量赋值,不可以用其他整数赋值。
指针常量:不允许修改地址,是地址不变的指针。(禁止偏移,允许赋值)
常量指针:不允许修改内容,是内容不变的常量,指向常量的地址。(禁止赋值,允许读取,允许偏移)
数组类似于不可偏移的指针(指针常量)。char s[20]="abcd";正确,s[1]='x';正确,s="abcd";错误。
指针数组:char *p[]={"aaa","bbb"};
函数指针:将函数地址当做参数传递,指向函数的指针。定义:返回值类型(*指针变量名)(参数列表)。赋值时,指针变量函数名;调用时,(*指针变量名)函数名(实参)或指针变量名(实参)。
结构体按位定义字节:
struct SDate{unsighed int nYear:11;unsighed int nMonth:4;};年用11位表示,月用4位表示。
共用体(联合体):所有变量共用一个空间,共用一个首地址。
C语言中,二维数组不可以直接给二级指针赋值。
类型定义,typedef int (*FUN_TYPE) (int a,int b);此为将长名字定义为短名字,用FUN_TYPE定义同类型的指针。
回调函数:将函数地址通过参数传递出来。
二维数组中,int a[3][4];中,a[0]类型为int [4]数组。sizeof(a)/sizeof(a[0])得到行数;sizeof(a[i])/sizeof(a[i][0])得到列数。行指针:(*a)[4];a++时偏移一行。*a和a[0]都指向第一行的4列,类型为int [4]。**a和*a[0]和a[0][0]都是指向第一行第一列。
二级指针:对一级指针的地址取地址。指向指针的指针。int *p=&n;int **q=&p;q的来源类型是int*类型。
二级指针做参数,带入的是一个一级指针的地址,改变的是实际参数所指向的地址;一级指针做参数,带入的是普通变量的地址,改变的是实际参数的数。
二级指针一般作用为:为一级指针申请堆空间。int **q={"abc","def",0};需要有空地址0做结尾。
free(p)时必须free申请时的地址,p++后已经不是原地址。
随机数,srand();rand();srand((unsighed)time(NULL)).
限制随机数范围,300到800,为300+rand()%500
C++
bool变量一个字节(和char相同),true和false。
引用型变量(别名变量):新申请的变量挂在原变量的内存地址上,(必须初始化)&p= i;
命名空间,将自己的函数包含,MYY::add();
namespce MYY {}打开时用using namespace MYY
重载函数:函数名相同,参数类型和个数不完全相同。
一个int型堆空间申请 int *p =new int;delete p;C语言中为 int *p=(int *)malloc(sizeof(int));free(p);
2个Int型堆空间申请int *p=new int[2];delete []p;如果为new int(2)则初始化为2。
多个指针数组堆空间申请,int **p=new int * [n];
C++输入函数cin>>i>>j;输出函数cout<<endl;
int i(5)等价于i初始化为5。
函数形参初始化时默认为从右向左,不能间隔初始化,则相应的实参可以不传递。
结构体重成员函数不占用空间和地址。
内联函数:清除函数调用时的时间开销,类似于宏定义,不进入函数,不进栈,不占用空间。内联函数检查参数类型。inline
成员函数中有与成员变量相同的局部变量,则使用就近原则。
成员函数中临时变量与成员变量相同,则用this指针调用成员变量。
数组不可以用=赋值,需用strcpy等。结构体可以用=复制。
面向对象的三大特征:封装,多态,继承。
析构函数,清理空间,没有返回值,没有参数,生命期结束后系统自动调用,一般用来删除申请的堆空间。
构造和析构关系:先构造的后析构。
全局定义的对象,main函数之前调用构造函数,整个程序结束之后调用析构函数。局部定义的对象,到达该处时调用构造函数,离开时调用析构函数。static定义的全局对象,到达该处时调用构造函数,整个程序结束时调用析构函数,即再次进入函数体后不进行初始化。
全局变量不可以放在头文件中,只能在头文件中用extern声明。
class缺省为私有成员,struct缺省为公有。
类成员对象地址从小到大排列,先定义先构造,先定义后析构。栈内对象地址从大到小排列。
类内对象都构造完后,然后在构造类自身对象。类自身对象先析构,然后类内对象再析构。
类内有静态成员函数时,实际为全局函数,名义上划分为类内,但无this指针。静态成员变量同。
MFC链表头文件为#include<afxtempl.h>
只读成员函数后面加const。只读函数中,this指针指向部分不能修改,形参、实参、临时变量可以修改。
只读成员变量只能在构造函数初始化列表中赋值。