数组,引用,指针那些事
Posted 拂石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组,引用,指针那些事相关的知识,希望对你有一定的参考价值。
数组、指针、引用三者夹杂不清,写法很容易让人记忆混淆,现在做如下总结:
- 数组的引用和引用的数组
C++中由于数组不允许拷贝和赋值,当我们函数形参设为数组时,编译器会自动将数组形参转换为数组首元素的指针,也就是说:
void fun(int data[10])
其实会被转换为:
void fun( int* ptr)
其中,这个ptr指针指向数组首元素,也就是:
ptr=data
综上,其实以下几种数组形参的写法其实是没有区别的:
void fun(const int a[10]); void fun1(const int b[]); void fun2(const int * ptr);
这里的const当我们不会修改时加上,如果需要修改数组元素,则去掉const。
此外,为了避免数组越界,可以显式地传递一个数组长度的形参。
- 数组和形参
函数可以传递指向数组首地址的指针,也可以传递数组的引用,写法如下:
void fun(int (&a)[10]); void fun2(int &a [10]);
需要注意的是,上面两种写法中,第一种里,a是10个int的数组的引用,第二种里,a是10个int的引用组成的数组。
- 指向数组整体的指针和指向数组元素的指针
在某种具体的编译目标平台下,其实指针的长度是固定的,比如,32位目标平台下,不管指针的类型是什么,其长度都4个字节,那么我们有如下用法时:
int a[10]; int* ptr=a; int b=*(ptr+1);
指针如何知道要后挪4个字节,读取a数组第二个元素的值呢? 这就是指定指针类型的作用了,这里,我们指定了ptr是int的指针,也就告诉编译器对这个指针操作时,每次挪动的字节数了。
也就是说,指定指针的类型,并不是为了确定指针的长度,因为它在固定编译目标平台下是写死的。其实指定的是每次挪动指针时,挪动的字节数。
那么,我们如何生成一个指向数组整体的指针?
类似于上面的数组的引用,我们用如下的方法产生一个指向整个数组的指针:
int (*ptr) [10];
括号必不可少,按照从内到外的解读方法,首先,ptr是一个指针,其次它指向一个数组,最后,数组元素的类型是int。不过这样要注意的是,声明指向整个数组的指针时,我们必须指定数组的长度,只有这样,对指针进行挪动操作时,才能确定每次挪动的字节数。
以上是关于数组,引用,指针那些事的主要内容,如果未能解决你的问题,请参考以下文章