函数指针
C语言中每个函数都有一个起始地址,函数指针指向这个起始地址,通过函数指针就能调用指向的函数。
命名方法:int (*pf)(int a,char b);
函数指针的典型用法:void qsort(void *base, int nelem, unsigned int width. **int (\* pfComapre)(const void *, const void *)**);
命令行参数
像使用命令行参数的程序须在main函数里加上argc、argv参数:
int main (int argc, char * argv[])
argc是int型,代表命令行参数的个数;argv是指针数组,char **类型,指向命令行参数。
位运算
- &:按位与:只有对应的两个二进位均为时才为1,否则为0。通常用来将变量中的某些位清零,且其他位保留不变;也可以用来获取某变量中的某一位。
-
- 例题:将int型变量的低8位全变成0,而其余位不变,则可以执行:
n=n & 0xffffff00;
。 - 例题:如何判断int型变量n的第7位是否为1:判断
n & 0x80
是否等于0x80即可。
- 例题:将int型变量的低8位全变成0,而其余位不变,则可以执行:
- |:按位或:只有对应的两个二进位均为时才为0,否则为1。通常用来将变量中的某些位置1,且其它位保留不变;
- ^:按位异或:只有对应的两个二进位不同才为1,否则为0。通常用来将变量中的某些位取反而其他位不变。
-
- 例题:将int型变量n的低8位取反,而其余位不变:
n ^= 0xff;
。 - 特点:如果ab=c,则可证明cb=a及c^a=b,可用于最简单的加密和解密。
- 作用:可以不通过临时变量交换两个变量的值:a=ab;b=ba;a=a^b。
- 例题:将int型变量n的低8位取反,而其余位不变:
- ~:按位非:将操作数中的二进制位0变成1,1变成0。
- <<:左移:a<<b,将a的各位二进制全部左移b位后的值。左移时,高位丢弃,低位补0,a的值不因运算改变。
- >>:右移:a>>b,将a的各位二进制全部右移b位后的值。右移时,低位丢弃,符号位跟随移动,当原符号为1时,右移高位补1,当原符号为0时,右移高位补0,a的值不因运算改变。
引用
引用方法:类型名 & 引用名 = 被引用变量名
int n=4;
int & r=n; //r引用了n,r的类型为int &类型
某个变量的引用,等价于这个变量,相当于该变量的一个别名。
注意事项:
- 定义引用时一定要将其初始化为引用某个变量
- 初始化后,它就一直引用该变量,不会再引用别的变量了。
- 引用只能引用变量,不能引用常量和表达式。
示例:
void swap(int & a,int & b)
{
int temp;
temp=a;a=b;b=temp;
}
int n1,n2;
swap(n1,n2);
int n=4;
int & SetValue() //返回值是int &型的变量
{
return n;
}
int main()
{
SetValue()=40;
cout<<n;
return 0;
}//输出:40
常引用:在引用前加上const即为常引用:const int & r=n
,r的类型为const int &,不能通过常引用去修改其引用的内容。
const关键字和常量
const定义常量时需要加上类型名。
const定义常量指针:const int * p=&n;
- 不可通过常量指针修改指向的内容
- 不可把常量指针赋值给非常量指针,但可以把非常量指针赋值给常量指针。
- 当函数参数为常量指针时,可避免函数内部不小心改变参数指针所指向的内容。
动态内存分配
C语言中可用malloc进行动态内存分配,C++中使用new运算符实现。
- 分配一个变量的动态内存:
P=new T;
其中T为类型名,P为T*指针。
int * pn;
pn=new int;
* pn=5;
- 分配一个数组的动态内存:
P=new T[N];
其中T为类型名,P为T*指针,N为分配数组
的元素个数。
int * pn;
int i=5;
pn=new int[i*20];
pn[0]=20;
new T;
new T[n];
的返回值都为T *.
使用完后记得用delete释放动态分配的内存空间。(一片空间不能释放两次)
int * p=new int[20];
p[0]=1;
delete [] p; //动态分配的数组delete时注意加上[]
内联函数 & 函数重载 & 函数缺省参数
- 内联函数:为了减少函数调用的开销,引入了内联函数的机制。编译器处理内敛函数的调用时,是直接将整个函数的代码插入到调用语句处,而不是产生调用函数的语句。
定义方法:在函数的定义前面加上inline。
- 函数重载:一个或多个函数,名字相同,但参数个数或参数类型不同。编译器会根据调用语句中实参的个数和变量类型来判断调用哪个函数。
插入到调用语句处,而不是产生调用函数的语句。
定义方法:在函数的定义前面加上inline。
-
函数重载:一个或多个函数,名字相同,但参数个数或参数类型不同。编译器会根据调用语句中实参的个数和变量类型来判断调用哪个函数。
-
函数缺省参数:定义函数时给最右边的连续若干参数赋缺省值。函数缺省参数的目的是提高程序的可扩充性,当给函数添加新参数时,原先调用该函数的语句未必需要使用新增的参数,使用缺省参数可以避免对原先调用该函数的语句进行修改。