数组,引用,指针那些事

数组、指针、引用三者夹杂不清,写法很容易让人记忆混淆,现在做如下总结:

  • 数组的引用和引用的数组

           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。不过这样要注意的是,声明指向整个数组的指针时,我们必须指定数组的长度,只有这样,对指针进行挪动操作时,才能确定每次挪动的字节数。

 

posted @ 2017-11-08 10:49  拂石  阅读(324)  评论(0编辑  收藏  举报