平时学术必须用Python多啊,但校招笔试绕不开语言基础,非cs科班小弱临阵整理些C++题备考。很弱很苦逼。。。
一、指针
1.二维数组指针
#include<stdio.h> int main(int args,char ** argv) { int map[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} }; int **pMap=(int **)map; printf("%d\n",map);//数组的首地址 printf("%d\n",*(map+1));//数组第二行首地址 printf("%d\n",*map+1);//数组首行的第二列地址 printf("%d\n",**(map+1));//第二行第一列数值 printf("%d\n",*(*(map+1)+1));//第二行二列数值 printf("%d\n",*(map+1)+1);//第二行二列地址 printf("%d\n",pMap[4]);//数组中的第5个数 printf("%d\n",&pMap[4]);//数组中的第4个数的地址 return 0; }
2. 引用和指针的区别
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
- ●指针是一个实体,而引用仅是个别名;
- ●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
- ●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
- ●引用不能为空,指针可以为空;
- ●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
- ●指针和引用的自增(++)运算意义不一样;
- ●引用是类型安全的,而指针不是 (引用比指针多了类型检查
二、sizeof
1.常规
char str1[] = “Hello” ;
char str2[5] = {'H','e','l','l','o'};
char str3[6] = {'H','e','l','l','o','/0'};
char *p1 = "Hello";
char *p2[]={"hello","world"};
int n = 10;
int *q = &n;
sizeof (str1 ) = 6 (自动加了'/0')
strlen (str1 ) = 5 (字符串的长度)
sizeof (str2 ) = 5 (字符数组的大小)
strlen (str2) = 未知 (该字符串缺少结束符'/0')
sizeof (str3) = 6 (字符数组的大小)
strlen (str3) = 5 (该字符串的长度为5)
sizeof ( p1 ) = 4 (p1是一个指针,大小为4)
sizeof ( p2 ) = 8 (p2是长度为2的字符串数组)
sizeof ( n ) = 4 (整型大小为4)
sizeof ( q ) = 4 (q是一个指针,大小为4)
2.动态分配内存
int *p = (int *)malloc( 100 );
sizeof ( p ) = 4 (p是一个指针,大小为4)
3.函数参数
void Function1( char p[],int num ){
sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}
void Function2( int p[],int num ){
sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}
三、类和对象
四. static
1.static关键字,static全局变量与普通全局变量的区别,static局部变量与普通变量的区别,static函数与普通函数的区别
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
五. const
在C中,const主要用来修饰变量、函数参数。 const作用于变量时,表示该变量具有不可改变的属性。当然,由这个属性,我们就可以清楚地知道为什么const变量要在定义的时候初始化,因为,const变量一旦定义之后,就不能改变(当然,这不是绝对的)。 很经典的例子是const修饰指针,int a = 3; const int * p = &a; int const *p = &a; int * const p = &a; const int * const p = &a; 一个区分const到底是修饰指针本身,还是修饰所指向的内容的简单的方法是看const位于*号的前还是后。如果const位于*号前,则修饰指针指向的内容;如果位于*号后,则修饰指针。由const的本质属性,我们就可以很容易地知道,const位于*号前,表示指针指向的内容不能修改,const 位于*号后,表示指针本身不能修改。如果有两个const,则表示指针指向的内容和指针本身均不能修改。 const作用于函数参数时,由const的本质属性,我们很容易清楚该函数不能改变这个参数。当然,常用的是const指针作参数。 在C中,const的用法主要就是上面两点。
在C++中,除了C中的用法外,还有以下一些用法。 const作用于类的成员,包括成员变量和成员函数。 const作用于成员变量时,我们同样可以根据const的不可修改属性,推论出该成员变量不可被改变。这就引出一个问题,const成员变量如何初始化?解决方法就是构造函数的初始化列表。我们知道,C++中,一般通过成员函数来访问成员变量的,而一般的成员函数是可以改变成员变量的值的,又因为const成员变量是不可以修改的,所以,我们就明白了为什么非const成员函数不能访问const成员变量了。 const作用于成员函数时,那么我们就可以推断出该函数不能修改成员变量的值,包括const成员变量和非const成员变量。当然,我们还可以得出const成员函数不可以调用非const成员函数,原因很简单,非const成员函数可以修改成员变量。
const作用于类的对象、指针或引用时,我们依然可以利用const的不可修改属性,推断出const对象、指针或引用是不可以修改内部的成员变量的,因此,我们就可以得出const对象、指针或引用不能调用非const成员函数的结论了
四、虚函数