首页 > 技术文章 > c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针

littleby 2015-09-15 18:36 原文

 

1.指针数组数组指针 引用数组 数组的引用

int *a[10]

指针数组

每一个元素都是一个指针

Int (*a)[10]

数组指针

a指向一个含有10个元素的数组

Int (&a)[10]

数组的引用

a是一个数组的引用

Int& a[10]

引用函数

非法

 

数组的引用:1.在程序体中

int a[10];

                       Int (&p)[10]=a;//引用数组

                     2.作为参数

#include <iostream>

#include <string>

using namespace std;

int myFun(int (&b)[10]);//其中10不可以省略

int main()

{

    cout << "HelloWorld!" << endl;

    int a[10]={0};//也可以先只申明指针后赋值,&可有可无

    cout<<"the sizeof a is "<<sizeof(a)<<endl;

    myFun(a);

    return 0;

}

 

int myFun(int (&b)[10]){其中10不可以省略

    cout<<"the sizeof b is "<<sizeof(b)<<endl;

    getchar();

    return 0;

}


引用数组:

         c/c++是不允许引用数组定义的,例如int &a[10]都是非法的。

 

2.函数指针和指针函数

int (*f)(int)

函数指针

P指向一个函数

int* f(int)

指针函数

该函数返回值是一个指针

Int& f(int)

引用函数

返回一个整型引用

….

函数的返回类型还有很多

 

 

函数指针:

int(*p)(string) =&myFun

请看下面的例子:



因为函数本身就是指针,myFun是指针常量p是指针变量,按理说,调用时应该这样写(*p)(x)但是实际上p(x)也可以。这是因为编译器在处理时做了一些工作来简化代码,所以建议用后者。同样道理p=&myFunp=myFun。但是声明时格式固定不要混淆。

 

3.变量的地址问题

         #include<IOSTREAM>

using namespace std;

 

int main()

{

    int a=0;

    int *p=&a;

    int &m=a;

   cout<<"&a="<<&a<<"\t"<<"a="<<a<<endl;

   cout<<"&p="<<&p<<"\t"<<"*p="<<*p<<"\t"<<"p="<<p<<endl;

   cout<<"&m="<<&m<<"\t"<<"m="<<m<<endl;

    return 0;

}

 

可以看出指针p存储了a的地址值,而指针p又存储在另外一个地址内

而引用只是给a起了一个代号.

4.数组的参数传递问题

先看下面的程序:


        

C语言中如果直接把一个数组传递给函数,函数的形参定义为,比如int b[10],那么b接收到的其实是a[5]的指针,准确的说他只是一个int类型的指针。因为他只是保存了a[5]的首地址,而且c++本就不会检查数组越界。比如函数中输出b[30],照样有值,其实就是相对b地址偏移20int类型的长度,在该位置的值强制转换为int输出。如图

            

                  知道这点那么形参也可以改为这样int *bint b[]int b[N](其中N可以是任意自然数),都能够编译通过且运行效果相同。

 

       5.数组作为返回值

    可以将数组名作为一个char *类型的变量返回,然后用sprintf将内容输出到数组,实例如下:

    

    在main函数中转化一下:

    

 

 

        

本文查看很多网上的文章,恕不能一一注明,如有差漏,请多指教。

 

 

 

 

 

 

推荐阅读