您的位置:首页 > 编程语言 > C语言/C++

C++各种相似对象的区别

2013-03-05 10:20 232 查看
1、数组指针和指针数组的区别 .

数组指针(也称行指针)

定义 int (*p)
;

()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:

int a[3][4];

int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。

 p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]

 p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组

定义 int *p
;

[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。

如要将二维数组赋给一指针数组:

int *p[3];

int a[3][4];

for(i=0;i<3;i++)

p[i]=a[i];

这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]

所以要分别赋值。

这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。

比如要表示数组中i行j列一个元素:

*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]

 

优先级:()>[]>*

2、指针常量和常量指针的区别

指针常量:指针常量是指针所指向的位置不能改变,即指针本身是一个常量。但是指针常量可以通过间接引用修改内存中的数据。:指针类型 *const 指针常量名=&变量名;

常量指针:指向常量的指针,指针所指向的内容不能改变,但是可以改变其所指向的地址:const 指针类型 *指针常量名=&变量名

4、重载、重写和隐藏的区别?

1)重载发生在统一各类中,函数名字相同,而参数列表不相同。有木有virtual关键字都无所谓,

2)重写发生在不同的类中,类于类是继承关系,函数名字和参数列表都相同。基类必须要有virtual关键字。

3)隐藏发生在不同的类中,如果参数列表不相同,那么关键字virtual有木有都无关要紧,如果参数列表相同,就是没有关键字virtual。

5、New delete 与malloc free 的联系与区别?

都是在堆上申请内存空间

1)new运算符在申请内存空间大小时候,还需要调用对象的构造函数。相对应的delete运算符在释放空间的时候需要调用对象的析构函数

2)malloc库函数只是分配空间,对应的free库函数就是释放空间。

6、struct 和 class 的区别?

struct的成员对象默认的都是公有的。而class的成员对象默认的都是私有的

7、const与#define的区别?

 const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

8、深拷贝与浅拷贝的区别?

浅拷贝:也就是按照比特一位一位地进行拷贝,是把一个类完全一样拷贝到另一个类。

深拷贝:在拷贝的时候,深拷贝会提供一块新的内存用来保存数据,并使新的对象的指针指向这块内存。

浅拷贝中,会发生两个类的实例内部的指针指向了同一块内存区域,当这两个对象析构的时候,同一块内存就会给析构两次,当然会出现问题.而在深拷贝中就不会发生这种情况。

一般的,如果类中没有赋值操作,编译器就是自动的提供拷贝函数,而这个拷贝函数就是浅拷贝。

 

9.strcpy和memcpy的区别?

其一:复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

其二:复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

其三:用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

 

10.宏与内联函数的区别?

宏代码本身不是函数,但使用起来象函数.预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return 等过程,从而提高了速度.使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应.

对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型).如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里.在调用一个内联函数时,编译器首先检查调用是否正确(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样).如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销.这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换.假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的.

       注意:关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用.

11.C语言的关键字 static 和 C++ 的关键字 static 有什么区别?

        1)在C语言中static修饰的是局部静态变量和外部静态变量和函数。

        2)在C++中static修饰的包括静态变量、函数,还修饰了在类中的成员数据和方法,即静态数据成员和静态成员函数。

no3.malloc/free和new/delete的区别?

12.比较strcpy、spritf和mencpy的区别?

        1、操作对象的不同,strcpy是字符串,sprintf是任意的数据类型,但目的是字符串,而mencpy是内存地址,并不限定于数据类型。

        2、效率不同。mencpy最高,strcpy次之,sprintf最低。

        3、功能不同:strcpy实现字符串的拷贝,sprintf实现数据类型转换为字符串类型,mencpy实现的是内存地址的拷贝。

13.数组与链表的区别?

        1、数组与链表的存储方式不同。数组的元素是存储在连续的空间且长度在编译期间就已经固定了,而链表是可不连续的动态空间,之间靠指针域联系起来的,

        2、数组有可能是发生越界问题,而链表就不会受限制的。

        3、在数据的查找数组可通过偏移地址实现快速查找,而链表需要按顺序检索节点,效率要低于数组。

        4、链表可快速度的进行增加删除节点操作,而数组需要移动大量的数据。

14.typedef和define的区别?

       1、 typedef是定义数据类型的别名,增加程序的可读性,而define是定义使用频繁的宏。

        2、typedef是在编译期间执行的,会进行类型检查,define在预编译期间执行的,只会进行简单的字符替换,不会进行类型的检查。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息