数组和结构体的区别
数组、结构体都是自建的数据结构,二者是相似的,但也有区别,其区别是:
-
数组内部数据类型相同,结构体内部数据可以不同;
-
数组按下标访问,结构体因为数据类型不同,,只能使用
类名.变量名来访问;
头指针,首元素结点、头结点的区别
- 首元素结点:第一个存储数据元素的结点
- 头结点:首元素结点之前的结点,其指针域指向首元素结点,其主要作用是方便对链表的操作。
- 头指针:指向链表中的第一个结点。可能是首元素结点,也可能是头结点。
struct结构体和union共同体的异同点
相同点:
- 都是由多个不同的数据类型成员组成
不同点:
-
在struct中,每个成员都有自己的内存,它们同时存在,
在union中,所有成员不能同时占用各自的一块内存,因此不能同时存在,只能存在一个
-
struct的长度为所有成员长度之和,union的长度为最长成员的长度
-
对struct的不同成员之间的赋值互不影响,而union不同成员赋值会重写其他成员
C++中结构体和类的区别
-
默认继承权限 class 的默认继承权限是
private;struct的默认继承权限是public -
成员的默认访问权限 class 定义的成员变量和函数的都是
private;struct定义的变量和成员函数都是public
另:在C语言中 struct 只能定义数据成员,而不能定义成员函数。而在C++中,struct 类似于class,既可以定义成员变量,也可以定义成员函数.
数组与链表的区别
- 数组静态分配内存;链表动态分配内存;
- 数组在内存中连续;链表可以不连续;
- 数组元素在栈区;链表元素在堆区;
- 数组利用下标定位,时间复杂度为O(1);链表定位元素时间复杂度O(n);
- 数组插入或删除元素的时间复杂度O(n);链表的时间复杂度O(1)。
数组与指针的区别
-
数组:对应一块内存区域。其地址和大小在生命期里不会改变,只有数组的内容可以改变。
指针:指向一块内存区域。它指向的内存区域的大小可以随时改变,当指针指向字符串时,它的内容是不可以被修改的,否则在运行时会报错。
-
用运算符sizeof可以计算出数组的容量(字节数),而无法计算指针所指内存的容量,得到的结果永远4(即指针变量所占内存单元的字节数)
-
在进行参数传递时,数组会自动退化为同类型的指针。
指针和引用的区别
- 指针是变量,存放地址的变量,占用4Byte或者8Byte;引用是对象的别名,大小为被引用对象的大小。
- 指针可以为空,可以声明之后再初始化,初始化后可以再改变;引用必须在声明的时候初始化,而且初始化之后不可再改变
- 指针可以有多级,引用只能是一级
- 指针和引用的自增(++)运算意义不一样。指针自增表示地址加1,引用自增表示值加1
数组指针和指针数组
- int (*ptr)[5],数组指针相当于二维数组,也就是指针的指针
- int *ptr[5], 指针数组是一个数组,数组存放的元素为指针
strlen和sizeof的区别
- strlen是函数,在运行时才能计算,返回字符串的长度,必须以‘\0’结尾
- sizeof是运算符,在编译时就计算好了。
#define与const的区别
- define不会做类型检查(容易出错),const拥有类型,会执行相应的类型检查
- define仅仅是宏替换,不占用内存,而const会占用内存
- const内存效率更高,编译器可能将const变量保存在符号表中,而不会分配存储空间,这使得它成 为一个编译期间的常量,没有存储和读取的操作
new和malloc的区别
- new按照数据类型进行分配,malloc 按照指定的大小分配
- new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化。
- new 不仅分配一段内存,而且会调用构造函数,malloc 不会。
- new分配的内存要用delete销毁,malloe 要用free来销毁;delete 会调用对象的析构函数,而free则不会。
- new是一个操作符可以重载,malloc 是一个库函数。
- malloc分配的内存不够的时候,可以用realloc扩容。 new没用这样操作。
- new 如果分配失败了会抛出bad_malloc 的异常,而malloc失败了会返回NULL.
- 申请数组时: new[]一次分配所有内存, 多次调用构造函数,搭配使用delete[], delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n.
机器语言、汇编语言和高级语言有何区别?
- 机器语言:站在计算机的角度,说计算机能听懂的语言。就是直接用二进制编程,直接操作硬件。
- 汇编语言:站在计算机的角度,用简写的英文标识符取代二进制去编写程序,本质上仍然是直接操作硬件。
- 高级语言:站在人的角度,说人话,即用人类的字符去编写程序,屏蔽了硬件操作。
C++对于对象的动态建立与静态建立
-
静态建立,例如 A a; 由编译器为对象在栈空间中分配内存。这种方法是直接调用类的构造函数。
-
动态建立,例如 A* a = new A(); 使用new运算符为对象在堆空间中分配内存。这种方法是间接调用类的构造函数。
第一步:执行operator new( )函数,在堆空间中搜索一块内存并进行分配
第二步:调用类的构造函数构造对象
使用场景选择:
静态对象由于是在栈中生成的,因而比动态的效率要高,而且不会造成内存泄露。静态较好 但标明动态对象的是一个指针,而标明静态对象的是一个值。当对象作为参数时,动态更好 另外,如果对象要在多个函数中使用,或者要在一个函数中建立,而在另一个函数中使用,动态更好