c++的指针类型简单总结

c++的指针类型,问题源于如下一件事情的争论。
1.如下地址设置
int array[4] = {0,1,2,3}
int * p = (int )(array+1)//地址+1
int
p2 = (int*)(&array+1)//地址的地址+1

cout<<(p-1) = 0
cout<<
(p2-1) = 3
与同事一起讨论,为什么p2的地址-1后取得的数据是3
其实这问题不难理解,首先原则,指针运算的最终结果取决于步长。
即:int* a = 5; a+1 = 5+4=9(为什么步长是4,因为int的类型是4所以int类型指针的步长是4)
回到上面的问题
1.假设array的地址是5,那么array+1是多少呢?
因为array==首地址的指针,array是int类型,array的首数据也是int行,那么首地址的指针就是int指针,步长是4。
array +1 = 9,即: p=9;
2.那么&array+1的地址是多少呢
那么array是什么类型呢,是数组类型,当把array当成对象理解时,那么这个对象时多大的呢,时44 = 16;
&array+1 = 5+16 = 21;
这样理解(cout<<
(p2-1) = 3)就容易了。
p2的地址是21但是当转换成int*时,步长就变成4了,所以p2-1 = 21-4 = 17,(array下标为3的位置);

上面的理解能解释通这个问题,但是同事们还在纠结:数组的名称本身就是地址,取地址的地址有什么意思呢。
想解释清楚这个问题,必须定义一个数组类型的指针。数组类型的指针怎么定义呢。
最初我因为是这样的
int*[4] arrayAddr;
后来确认这种方式是不对的,这里吐槽一下,这里确实觉得c++的语法确实不太友好,个人觉得不符合我们通常思考的习惯。
其实是这样 int (*arrayAddr0)[4]
好了步入正题,扯的有点远了,我就是想把c++的指针做一个总结:
c++用到指针的地方主要有以下3类:
1.对象,基本类型
2.数组
3.函数指针
4.函数指针数组
对象好理解,不举例了,下面对数组和函数指针做如下举例
数组:
int (*pa) [2]; //类型原型: int a[2]
int (*pa) [2][2]; //类型原型:int[2][2]
函数指针
int (*pfunName)(int ,int ); //类型原型:int funName(int a,int b);
void (pfunName)(); //类型原型:void funName();
函数指针数组
int (*pFunArray[5])(int ,int);

通过上面的举例,大家应该马上看出规律来了:
类型的定义无非是讲定义的类型中的名称部分用括号扩起来再加个指针符号 (*函数或者数组名称)

我到今天才对指针有这么一个总结的认识(尽管以前都用过,但是没有发现期间有这么简单的一个规律),以后关于指针的类型,我再没有语法猜测的困惑了。
数组指针和指针数组的区别

猜你喜欢

转载自blog.csdn.net/xie__jin__cheng/article/details/88379040