C/C++
二十六、 字符型数组,指针数组
对char *p=”Hello;实际上p是一个指针,指向的内容是字符串常量Hello,指向的内容是不可修改的!如果执行*p+1=’F’操作是错误的!
因为p是指针,可以让p指向别的内容,如p=“china”是正确的。
char p[]=”Hello”;实际上是一个字符串数组初始化的方式,字符串数组有两种初始化方式,一种是这样的初始化,另外一种是列表初始化;
而p可以理解为是一个常量指针,p的值不可修改,如p++操作是错误的。
二十七、 虚函数
虚函数是在基类中作总体框架定义,定义时在函数zhi的返回类型名前加上virtual构成dao。它的具体不同实现版本是在其类的派生类里实现的。纯虚函数是在其类中连基本框架都定义不出来,所以只是用“virtual 类型名 函数名()=0;”的形式来声明基类中有这么一个函数,而它的实现则完全由基类的派生类根据不同需要来完成。
在C++中基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数;另一种是基类希望派生类直接继承而不要改变的函数,对于前者通常定义为虚函数,当我们使用指针或引用对虚函数的调用将被动态绑定,即根据所绑定的对象不同,所执行的函数不同,有可能是基类的,也有可能是派生类的。C++中多态就是通过虚函数来实现的。
每个成员函数都包含一个特殊的指针,叫this指针,这里不同类中的虚函数(成员函数)指针不一样,故而区分。
二十八、 二维数组与数组指针
例:在C语言中,若有定义:int a[4][10](其中a<=i<4,0<=j<10);则下列选项中对数组元素a[i][j]引用错误的是(A)
A *(a+i)+j
B *(&a[0][0]+10*i+j)
C *(a[i]+j)
D *(*(a+i)+j)
解析:
A是a[i][j]的地址,而D选项是在A的基础上再取*则是a[i][j]的值。
B正确,a[0][0]取地址是数组第一个元素的地址,加上10*i为第i行第0个元素的地址,再加j是a[i][j]的地址,再取*是a[i][j]的值。
C正确,a[i]是第i行第0个元素的值,加j后为a[i][j]的地址,再取*就是a[i][j]的值。
对于二维数组,取一个*是为地址,取两个*就是指针所指向的值。
二十九、 ++,--例题
例:若执行下面的程序时,从键盘上输入5,则输出是(6)。
int main(int argc, char ** argv)
{
int x;
scanf(“%d”,&x);
if(x++>5)
printf(“%d\n”,x);
else
printf(“%d\n”,x--);
return 0;
}
进行if判断时由于++在后所以先进行判断,然后++,不满足条件进入else,此时x++变为6。
进入else后由于--在后所以先打印,之后再--,打印出的x为6,然后x--变为5。
三十、 函数类型返回值基础知识
1、 返回值
C中:如果函数未指定返回值类型,则默认为int
C++中:如果一个函数没有返回值,返回值类型必须指定为void
2、 参数列表
C中:如果函数没有指定参数列表,则默认可以接受多个参数。
C++中:有严格的类型检测,没有参数列表的函数默认为void,不接受任意参数。
3、 缺省参数(即给参数一个默认值)
C:不支持。
C++:支持(如果没有指定实参则使用缺省值,有则使用指定参数)
1) 默认实参必须在参数列表的结尾
2) 默认参数只能出现在函数声明或者定义二选一中
3) 缺省值必须是常量或全局变量
4) 缺省参数必须是值传递或者常参传递
4、 函数重载
C:不支持
C++:支持在同一作用域中存在几个功能类似的同名函数,但参数列表(参数个数、类型、顺序)不同
5、 引用和指针
引用:可以看作是一个变量的别名
特点:
a) 必须初始化
b) 一个变量可以有多个引用
c) 引用一旦初始化,就不能再成为其他变量的引用(数组不能被引用)
引用与指针的异同:
同:底层实现相同
异:
a) 引用必须初始化
b) 引用一旦绑定就不能更改
c) ++的结果不同
d) 有多级指针,没有多级引用