说一下 static 关键字的作用
说一下const作用
请说一下 C/C++ 中指针和引用的区别
请回答一下数组和指针的区别
指针是指向另一个内存的变量,其内容是所指内存的地址,指针有一块自己的内存
保存数据的地址,需要*间接访问数据
2.数组
保存数据,通过索引直接访问数据,通常用于固定数目且数据类型相同的元素。数组名是指针常量,是指向数组第一个元素的地址。
注:指针指向一个数组时,可用下标访问和解引用访问,此时指针和数组名作用差不多。
请回答下指针数组和数组指针的区别
如int *a[10],一个有10个指针的数组,每个指针指向一个整形数。
2. 数组指针,是指一个指向数组的指针,它其实还是指针,只不过它指向整个数组。
如int (*p)[10],一个指向有10个元素整型数组的指针。注:[]优先级高于*。
应用:
1、多个字符串一般可存储在二维数组或指针数组中,所以指针数组用于存放多个字符串,或作为函数参数传递多个字符串;
注:a、二级指针和指针数组某些时候是一个意思。
b、指针数组(也就是元素为指针类型的数组)常常作为二维数组的一种便捷替代方式。
一般情况下,这种数组中的指针会指向动态分配的内存区域。
2、数组指针一般用于指向一个二维数组(其类型是一个指向一维数组的指针)来访问数组的元素。
请回答下指针函数和函数指针的区别
如:int (*p)(int, int) p=func, 初始化时给函数名,函数名是该函数的入口地址。
如:void function( int a, int (*p)(int , int) )
请你回答一下野指针是什么?
野指针指向了一块随机内存空间,不受程序控制。如1、未初始化的指针,指针指向一个已删除的对象或者指向一块没有访问权限的内存空间;2、free(p)后,p没有置null,。注:指针释放需置NULL。
说一下 C++和 C 的区别
说一下#include"stdio.h"和#include
请你说一说 strcpy 和和 strlen
请你来说一下堆和栈的区别
1)申请方式:
栈由系统自动分配和管理,堆由程序员手动分配和管理。
2)效率:
栈由系统分配,速度快,不会有内存碎片。
堆由程序员分配,速度较慢,可能由于操作不当产生内存碎片。
3)扩展方向
栈从高地址向低地址进行扩展,堆由低地址向高地址进行扩展。
4)程序局部变量是使用的栈空间,new/malloc 动态申请的内存是堆空间,函数调用时会进行形参和返回值的压栈出栈,也是用的栈空间
请你来说一说重载、覆盖和重写
请你说一说你理解的多态和虚函数
静态多态主要是重载,在编译的时候就已经确定;
动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了 virtual 关键字的函数,在子类中重写时候不需要加 virtual也是虚函数。
2.虚函数:指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用相应对象的函数。
虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。
请你来说一说 extern “C”
C++调用 C 函数需要 extern C,因为 C 语言没有函数重载
请你回答一下 new/delete 与与 malloc/free 的区别是什么
int main( int argc, char** argv )参数意义
argv[0]:存储程序名;
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串;
argv[2]:指向第二个字符串。
结构体数据对齐原则如下:
char 1 字节;
short 2 字节;
int 4 字节; float 4 字节; long 4 字节;
double 8 字节; long long 8 字节;
源代码-------------预处理、编译、汇编、链接-----------可执行文件
.h头文件中的ifndef/define/endif 的作用?
答:防止该头文件被重复引用。
说一下volatile关键字作用
编译优化时,为提高存取速度,有时会把变量读取到寄存器,方便读取;但有时别的线程改变了变量的值,但寄存器值不变,造成程序读取值不一致,所以使用volatile从变量内存中读取。
修饰某个变量,表明某个变量的值可能随时被外部改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取,从变量的地址中(内存中)读取数据。
场景:多用于多线程或多CPU编程
说一下C语言中的内存分区
什么是预编译/预处理,何时需要预编译?
答:预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
C语言实现程序跳转到绝对地址0x100000处执行
强制把绝对地址0x100000转换成函数指针(void (*)())0x100000,然后再调用它:
((void(*)()) 0x100000)()
写一个“标准”宏(对于一个频繁使用的短小函数)
#define MIN(A,B) ( ( (A) < (B))? (A) : (B))
#define MAX(A,B) (((A)-(B))>>31 ? (B) : (A))
#define SET(a,n) ( a | ( 1 << n ) )
#define CLEAR(a,n) ( a & ~( 1 << n ) )
注:左移n位相当于将原数乘以2^n,右移n位相当于将原数除以2^n。左移1位==乘2
论述含参数的宏与函数的优缺点
答: 带参宏 函数
处理时间 编译时 程序运行时
参数类型 没有参数类型问题 定义实参、形参类型
处理过程 不分配内存 分配内存
程序长度 变长 不变
运行速度 不占运行时间调用和返回 占用时间
链表和数组有什么区别
数组和链表有以下几点不同:
(1)存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。
(2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。
(3)数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。
(4)越界问题:链表不存在越界问题,数组有越界问题。
说明:在选择数组或链表数据结构时,一定要根据实际需要进行选择。数组便于查询,链表便于插入删除。数组节省空间但是长度固定,链表虽然变长但是占了更多的存储空间。
sizeof 和 strlen 的区别
注:不要用sizeof求存储在数组的字符串长度,那样求得的值是数组的长度。
头文件的作用是什么?
答:一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要
向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,
而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声
明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
谈谈你对编程规范的理解或认识
编程规范可总结为:程序的可行性,可读性、可移植性以及可测试性
求数组a长度:
N= sizeof(a)/sizeof(a[0])
!!!!良好的编码习惯: