当前位置:首页 >> 饮食养生

水滴石穿语言之指针综合谈的

2021-09-06 09:57 来源:莱西养生网

概述

Joel Spolsky认为,对指针的理解是一种aptitude,不是通过训练就可以达到的。虽然如此,我还是想谈一谈这个C/C++语言中最强劲也是最容易出错的要素。

鉴于指针和目前计算机内存结构的关联,很多C语言比较本质的特点都孕育在其中,因此,本篇和第六、第七两篇我都将以指针为主线,结合在实际编程中遇到的问题,来详细谈谈关于指针的几个重要方面。

指针类型的本质分析

1、指针的本质

指针的本质:一种复合的数据类型。下面我将以下面几个作为例子进行展开分析:

a)、int *p;

b)、int **p;

c)、int (*parValue)[3];

d)、int (*pFun)();

分析:

所谓的数据类型就是具有某种数据特征的东东,比如数据类型char,它的数据特征就是它所占据的内存为1个字节, 指针也很类似,指针所指向的值也占据着内存中的一块地址,地址的长度与指针的类型有关,比如对于char型指针,这个指针占据的内存就是1个字节,因此指针也是一种数据类型,但我们知道指针本身也占据了一个内存空间地址,地址的长度和机器的字长有关,比如在32位机器中,这个长度就是4个字节,因此指针本身也同样是一种数据类型,因此,我们说,指针其实是一种复合的数据类型,

好了,现在我们可以分析上面的几个例子了。

假设有如下定义:

int nValue;

那么,nValue的类型就是int,也就是把nValue这个具体变量去掉后剩余的部分,因此,上面的4个声明可以类比进行分析:

a)、int *

*代表变量(指针本身)的值是一个地址,int代表这个地址里面存放的是一个整数,这两个结合起来,int *定义了一个指向整数的指针,类推如下:

b)、int **

指向一个指向整数的指针的指针。

c)、int (*)[3]

指向一个拥有三个整数的数组的指针。

d)、int (*)()

指向一个函数的指针,这个函数参数为空,返回值为整数。

分析结束,从上面可以看出,指针包括两个方面,一个是它本身的值,是一个内存中的地址;另一个是指针所指向的物,是这个地址中所存放着具有各种各样意义的数据。

2、对指针本身值的分析

下面例子考察指针本身的值(环境为32位的计算机):

void *p = malloc( 100 );

请计算sizeof ( p ) = ?

char str[] = “Hello” ;

char *p = str ;

请计算sizeof ( p ) = ?

void Func ( char str[100])

{

请计算 sizeof( str ) = ? //注意,此时,str已经退化为一个指针,详情见

//下一篇指针与数组

}

拓展未来发展空间。 分析:上面的例子,答案都是4,因为从上面的讨论可以知道,指针本身的值对应着内存中的一个地址,它的size只与机器的字长有关(即它是由系统的内存模型决定的),在32位机器中,这个长度是4个字节。

3、对指针所指向物的分析

现在再对指针这个复合类型的第二部分,指针所指向物的意义进行分析。

上面我们已经得到了指针本身的类型,那么将指针本身的类型去掉 “*”号就可得到指针所指向物的类型,分别如下:

a)、int

所指向物是一个整数。

b)、int*

所指向物是一个指向整数的指针。

c)、int ()[3]

()为空,可以去掉,变为int [3],所指向物是一个拥有三个整数的数组。

d)、int ()()

第一个()为空,可以去掉,变为int (),所指向物是一个函数,这个函数的参数为空,返回值为整数。

4、附加分析

另外,关于指针本身大小的问题,在C++中与C有所不同,这里我也顺带谈一下。

在C++中,对于指向对象成员的指针,它的大小不一定是4个字节,这主要是因为在引入多重虚拟继承以及虚拟函数的时候,有些附加的信息也需要通过这个指针进行传递,因此指向对象成员的指针会增大,不论是指向成员数据,还是成员函数都是如此,具体与编译器的实现有关,你可以编写个很小的C++程序去验证一下。另外,对一个类的静态成员(static member,可以是静态成员变量或者静态成员函数)来说,指向它的指针只是普通的函数指针,而不是一个指向类成员的指针,所以它的大小不会增加,仍旧是4个字节。

慢性胃炎吃什么药好
日照白癜风最好医院
呼和浩特妇科哪好
相关阅读
大白熊犬四肢无力是不是生病的前兆位置

大白熊犬四肢无力是不是生病了?快乐伴随:如果没有别的症状可以排除犬瘟,大白熊犬价格犬瘟会带有精神不好,食欲不振,流浓鼻涕,浓眼屎等症状。一般这种情况有几种可能:你开出的食谱中维生素的摄入过...

大白熊犬呕吐拉稀该吃什么食物位置

6个月大白熊犬,前天晚上受凉,昨天开始呕吐拉稀,便血。看医生之后吃药好转,一夜没有再吐也没拉,精神变好,食欲恢复.今天中午大便还是有点稀,带血.医生开的药也在吃,大白熊犬怎么喂养?风雪恋缘:大...

大白熊犬合理的梳理方法及其要领位置

大白熊犬属于大型的犬种,还拥有着一身雪白的毛发,想要它的毛发时时刻刻都保持着干净而且还顺滑光亮,家长们就必须勤给它梳理毛发,才可以基本保证让它拥有一个顺滑的毛发。给大白熊犬梳理毛发的好处数...

大白熊犬可以喝酸奶帮助肠胃消化吗位置

大白熊犬可以喝酸奶吗?平时可以吃点什么帮助肠胃健康。狼的诱惑:狗是可以喝酸牛奶的最好能挑选乳酸菌的 会对大白熊犬价格的肠胃和消化系统有好处因为酸奶的吸收率比牛奶高.和牛奶相比,酸奶中的钙没...

大白熊犬发情特征和交配需要注意的事项位置

大白熊犬发情特征,当家里养的大白熊犬开始学会抱着主人的腿或者遛狗的时候发现自己狗狗会抱着别的狗狗的时候,有些饲主就误以为家里的狗狗发情了,其实并不然,这只是宣誓的一种举动,那么大白熊犬真正...

大白熊犬为什么总吐拉稀位置

大白熊犬为什么会呕吐,拉稀。鼻子会流血?笑傲股林:如果你家大白熊犬有吃塑料袋,毛线,钓鱼线,袜子什么的,就要做B超活x光检查一下肠道;以上两点是不拉稀得情况下的结论。去检查一下吧。如果我是对...

友情链接