关于c++的以下c++代码可能会出现什么问题?

C++中 这2个指针 有什么区别?

第一个是一个有5个元素的数组,每个元素是一个指向int类型的指针

第二个是数组指针:是指向数组的一个指针,如int (*p)[5] 表示一个指向5个int元素的数组的一个指针

C语言的(double *)和&这两种操作都是取地址么?有什么不同?

如果是func((double *)a);也就是讲double数组变成指针传给func函数。(如果不做类型转换貌似也可以自动退化为指针)。

也就是说a本身其实就是一个指针。所以转换前a是double*类型的,转换后也是。

在问几个关于c++的问题

1.已知一函数的形参说明为double *(*p)[10],则下列数组可以作为对应实参的是()

我先解释一下double **p[10],这表示定义了一个指针数组,共10个指针,每个指针指向一个一维double数组。(方括号[]运算级别比*高,加括号可以改变结合顺序。)

现在解释double *(*p)[10] ,和前面不同的是,这里没有10个指针,只有一个指针。但是这个指针比较特殊,它指向一个二维double数组,这个二维double数组有10列,行数暂时不确定。

A:double *F[10],不选。定义了一个指针数组,共10个指针,每个指针指向一个double值。
D:double *(*F)[10],实参必须要有确定的值,这里数组行数不确定,所以不行。

2.指针数组中的元素是地址吗?

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
指针数组中的元素是一系列特殊的变量。

不管什么类型的指针,在32位平台里,指针本身占据了4个字节的长度。你只要用函数sizeof(指针的类型)测一下就知道了。

指针: 其实指针这个概念在谭浩强的<C程序设计>这本书上是这样说的,指针就是地址,指针值就是地址值。指针变量就是存放指针的

变量,所以一定不要将指针与指针变量搞混淆了。指针仅仅是一个地址值,而指针变量就是存放指针(也就是地址的变量)

例如整型指针: int *p;p是一个指向int类型数据的指针变量。里面存放的地址(也就是指针)是一个int类型变量的地址。指针变量时

有类型的,例如p的类型就是int *表示p是一个指向int类型的指针变量。如何知道一个指针变量的类型呢,最简单的方法就是去掉变

量定义语句中的变量名,剩下的部分就是其类型,这种方法适用于所有的变量定义,例如int a;a的类型是int 。 int b[10];b的类

型是int[]表示是一个数组(关于数组类型这里不谈,因为这个问题很微妙,其实在c、c++中没有数组类型这个概念,包括函数类型也

是一样的),int *c;c的类型是int *。int ** d;d的类型就是int **;所以通过这种方法来判断一个变量的类型是很方便的。

说道指针变量,我们必须说到得有几个方面。

这个很重要,一个指针是有类型的,也就是一个地址是有类型的。具体说是某一个地址会指向不同类型的数据,这是不一样的,例如

int *p;p是指向int型数据。 double*p1;p1是指向double型数据。但是p和p1本身在内存中占用的空间是4个字节(对于32位的系统来说

),如果是在TC中编译c程序,应该是2个字节了(dos操作系统是16位的)。有人说地址不就是一个值吗,类似于0xfffdddcc这样的地址

数值,为什么还分什么类型呢,我要说的是这个关系很大。我们知道指针是有运算的,int *p=&a;那么p++到底加了多少呢,不要以为

是将p里面的地址值加了1,这是完全想当然。实际上加了sizeof(int)这么多个字节。也就是说加了一个int元素应该占用的字节,这

样在数组中我们可以通过这种方式从上一个元素很方便的让指针变量指向下一个元素。p+5的话实际上是加了p+sizeof(int)*5这么多

个字节。 另外一点事指针的类型决定了当指针解引用的时候其所以指向的内存单元中的二进制数据如何解释的问题。例如int *p=&a;

那么(*p)取得的数字就是一个整型数据,如果(*((char *)p))得到的就是一个字符型数据了。p本来指向的是int型数据(有4个字节)的

首地址,如果将其强制转换为一个指向char类型的指针变量,那么在解引用的时候只取第一个字节的数据,并将其解释为一个ascii码

代表的字符。 还有如果是一个指向函数的指针变量,我们可以通过此指针变量直接调用函数。例如int(*function)(int);此时

function指向一个函数,此函数具有一个int参数,返回一个int值。那么通过指针可以这样调用该类型的函数了int a=function

(100); 或者int a=(*function)(100);其实要不要解引用都是可以的。不过以前是需要解引用的,现在c标准规定这两种方法都可以。

总的来说指针的类型很重要。

我们向一个函数传递数组的时候一般是传递数组名,我们知道数组名是一个代表数组中第一个元素的地址并且数组名是不可以当左值

的。其实你又没有想过数组名到底是什么呢。有人说其实数组名就是一个指针常量,是一个不可以改变的指针常量。例如:int a[10]

=; 那么a可能的类型是int * const a;注意const的位置(关于指针常量和常量指针,这个以后说),那么这种

说法到底对不对呢。我们可以通过sizeof运算符来计算某一种数据类型占用的存储空间。例如 sizeof(10)的值为4,注意这里我都假

设在32位的操作系统上面编译。其实sizeof(10)和sizeof(int)是一样的,仅仅是求这种类型的数据占用多少内存空间,而不是说具体

的某个数据占用的空间,因为对于10这个文字常量来说根本不会占用内存空间的,其实随着程序直接编码到源程序中的,不存在分配

内存的问题。那么我们这样计算sizeof(a);是不是如我们所愿得到的是4呢。 结果可能会有意外,因为其值是sizeof(int)*10也就是

40个字节,显然这个字节数是整个数组占用的字节数。而不是int *类型的指针变量占用的字节数,我们知道一个地址只占用4个字节

那么这说明数组名绝对不是简单的int*类型。但是数组确实具有int*的特性。例如int*p=a;这是不会报错的。而且在函数之间传递的

一个指针可以指向一个函数,指针可以作为函数参数,函数可以返回一个指针类型的数据。

指向函数的指针: 指向函数的指针,实际上此指针就是函数代码的入口地址。我们可以通过这样的方式调用函数。例如:

那么在main函数中可以这样写:

这都是可以的,另外我们可以通过一个指针数组存放指向函数的指针:

关于各种指向函数指针的声明,请自己查阅有关资料。

引用相当于别名,其实你直接将其当做一个别名就可以了。引用与指针的区别: 引用必须初始化,而且初始化之后不可更改,指针

这段代码修正了6_21.cpp里面由浅复制带来的问题。

问题如下:当深拷贝后,为什么调用析构函数后还会出现默认构造函数会被调用,也就是deleting后面有Destructor

我要回帖

更多关于 c++算法 的文章

 

随机推荐