C/C++ 面试知识点

基础知识1

1. struct 大小确定

由于内存对齐的原则,在32位机器上,内存是4字节对齐,也就是说,不够4个字节的按 4字节来算。

同理,在64位机器上,内存是8字节对齐。

struct test1
{
int a;
char b;
int c;
}TEST;   int length_1 = sizeof(TEST);   // 12= 4+4+4  // sizeof 是运算符不是函数

struct test2
{
int a;
char b; char d; char e; char f;
int c;
}Test2;  int length2 = sizeof(Test2);  // 12= 4+(1+1+1+1)+4

struct test3
{
char a;
}Test3;  // 1

struct test4
{
char a;
char b;
}Test4;  // 1+1 =2

前面的字节加后面的字节不超过内存对齐所需要的字节,就不会用0来填充; 实际多少个字节就是多少个字节 

2.全局变量、局部变量、静态变量的作用域以及存放的内存区域

3. static 关键字的作用

int a=0, b=1;
cout <<a<<b<<endl;  // 0 1

1>在函数体内部定义变量,该变量从程序开始到结束只会分配一次内存,当再次进入该函数的时候,其值不变,仍为上次退出时的值 

int f()
{
static int i=0;
return i++;
}

cout<< f()<<f()<<f()<<endl;  // 321

模块内的static定义的变量和函数不能被外部引用,唯一的办法是通过一个间接变量或者函数来引用才行

类中定义的static变量属于整个类,即类成员变量,与对象无关,只会在运行的时候创建一次

类中定义的static函数属于整个类,及类成员函数,与对象无关,所以不能在静态函数里面使用this指针,这个是对象独有的。

例子:
class TEST
{
public:
static int m_i;
static int f() { return m_i; } //静态成员函数只能引用静态成员变量
};
int TEST::m_i = 6;
int main()
{
cout << TEST::f() << endl;    ////////
return 0;
}

4. const 

定义普通变量的时候,只能初始化一次,以后不可再修改其值。

定义指针变量时,再类型前,则值不能改,再类型后,则其地址不能改,若两个都有,则两者都不能改。 

5.数组地址

int a[] = {1,2,3,4,5};
cout << "&a[0]: "<< &a[0]<<endl;
cout << "&a[1]: "<< &a[1]<<endl;
cout << "&a[2]: "<< &a[2]<<endl;
cout << "&a[3]: "<< &a[3]<<endl;
cout << "&a[4]: "<< &a[4]<<endl;
cout<<"(&a[0]+1): "<< &a[0]+1<<endl;
cout<<"(a+1): "<<a+1<<endl;
cout<<"(&a+1): "<<&a+1<<endl;

&a[0]: 0x61fefc
&a[1]: 0x61ff00
&a[2]: 0x61ff04
&a[3]: 0x61ff08
&a[4]: 0x61ff0c
(&a[0]+1): 0x61ff00
(a+1): 0x61ff00    // value for a and &a is the same, but the concept is diff, a 表示数组的首地址, &a表示整个对象的首地址, 所以当它+1的时候,就会跳出数组边界
(&a+1): 0x61ff10

6.C的结构体和C++的结构体的区别

a.C结构体内部不允许有函数存在,C++允许 
b.内部成员变量权限不同,C的只能是public,C++的可以有三种。 
c.C结构体不可以继承,C++可以继承结构体或者类

猜你喜欢

转载自www.cnblogs.com/gonggong306/p/10183839.html