1、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为( p_i=n-i+1.)
2、考虑字节对齐问题(32位系统),输出16
union un {
short s[7];
int n;
};
int main() {
cout << sizeof(un) << endl;
system("pause");
return 0;
}
3、get函数返回局部变量的地址,打印出现乱码(地址无法正常使用)
char* get(void) {
char p[] = "hello";
return p;
}
int main() {
char* str = nullptr;
str = get();
cout << str << endl;
system("pause");
return 0;
}
4、输出 4,&a + 1代表当前的下一行 的首地址。
int main() {
int a[4] = { 1,2,3,4 };
int* ptr = (int*)(&a + 1);
cout << *(ptr - 1) << endl;
system("pause");
return 0;
}
5、内联函数的作用
1、内联函数可减少cpu的系统开销,并且程序的整体速度将加快,但当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数。
内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。
2、值得注意的是,内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如何函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。
内联函数具有一般函数的特性,它与一般函数所不同之处公在于函数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。在使用内联函数时,应注意如下几点:
1、类内定义的函数是内联函数,类外定义的函数是非内联函数(短函数可以定义在类内,长函数可以定义在类外)。
2、可以为类外定义的函数指定 inline 关键字,强行为内联函数。
3、在内联函数内不允许用循环语句和开关语句。
4、内联函数的定义必须出现在内联函数第一次被调用之前。
3、内联函数inline:引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。在使用内联函数时要留神:1.在内联函数内不允许使用循环语句和开关语句;2.内联函数的定义必须出现在内联函数第一次调用之前;3.类结构中所在的类说明内部定义的函数是内联函数。
6、结构体指针与结构体,输出3
struct MyStruct{
int a, b, c;
};
int main() {
struct MyStruct s = { 3,4,5 };
struct MyStruct* p = &s;
cout << *(int*)p << endl;
system("pause");
return 0;
}
7、回调函数概念
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
8、c语言规定标识符
c语言规定标识符只能由字母,数字,下画线3种字符组成
第一个字符必须是字母或下画线。
9、在___阶段可发现被调用的函数未定义?
//预处理:处理#include、宏替换和条件编译
//编译:生成目标文件(.cpp->.o)
//链接:链接多个目标文件
//例子:
//main.cpp
int main(){
fun();
}
//编译不可通过,提示函数fun()未声明
void fun();
int main(){
fun();
}
//编译可通过,链接不可通过,提示函数fun()未定义
1、预处理:头文件展开、宏定义展开、条件编译等,不做语法检查
2、编译:检查语法,将预处理后文件编译生成汇编文件
3、汇编:将汇编文件生成目标文件(二进制文件)
4、链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
找不到函数都会去依赖库中找,最终找不到,报错!
10、类的私有成员可在本类的成员函数中进行访问。 类的私有成员在派生类中是隐藏的,只能在基类的成员函数中访问。
11、fopen函数
12、3
int main() {
int j = 2;
int i = 1;
if (i == 1) j = 3;
if (i == 2) j = 5;
cout << j << endl;
system("pause");
return 0;
}
13、int型的指针如果+1,按照指针的加减,为加4
void main() {
int* a = (int*)2;
printf("%d\n", a + 1); //6
printf("%d\n", a + 2); //10
printf("%d\n", a + 3); //14
system("pause");
return ;
}