美文网首页
c指针和引用和函数指针

c指针和引用和函数指针

作者: 黑小柴 | 来源:发表于2019-05-21 14:06 被阅读0次

    引用:引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

    int main(){
       int a = 1;
       int& b = a;// 引用一个引用变量,别名的别名
       cout<<"a:address->" <<&a<< endl;
       cout<<"b:address->" <<&b<< endl;
       a = 2;
       cout<<a<<endl;
       b = 3;
       cout<<a<<endl;
       int& c = b;
       cout<<a<<endl;
       c = 4;
       cout<<a<<endl;
    }
    结果
    a:address->0x7ffeefbe675c
    b:address->0x7ffeefbe675c
    2
    3
    3
    4
    

    指针传参

    void change(int *a,int *c,int *e){
        printf("%p\n",a);
        printf("%p\n",c);
        printf("%p\n",e);
        int *b =a;
        *b=3;
        int *d;
        d=c;
        *d=4;
        *e=5;
    }
    
    int main(){
        int i=0,j=0,k=0;
        change(&i,&j,&k);
        printf("i=%d,j=%d,k=%d\n",i,j,k);
        return 0;
    }
    
    结果
    0x7ffe057626fc
    0x7ffe05762700
    0x7ffe05762704
    i=3,j=4,k=5
    

    引用传参

    void change(int &a, int &b,int &c){
       printf("%p\n",&a);
       printf("%p\n",&b);
       printf("%p\n",&c);
       a=3;
       b=4;
       c=5;
    }
    
    int main(){
        int i=0,j=0,k=0;
        change(i,j,k);
        printf("i=%d,j=%d,k=%d\n",i,j,k);
        return 0;
    }
    结果
    0x7ffeeb281758
    0x7ffeeb281754
    0x7ffeeb281750
    i=3,j=4,k=5
    

    函数指针

    int max(int x, int y)
    {
        return x > y ? x : y;
    }
     
    int main(void)
    {
        /* p 是函数指针 */
        int (* p)(int, int) = & max; // &可以省略
        int a, b, c, d;
     
        printf("请输入三个数字:");
        scanf("%d %d %d", & a, & b, & c);
     
        /* 与直接调用函数等价,d = max(max(a, b), c) */
        d = p(p(a, b), c); 
     
        printf("最大的数字是: %d\n", d);
     
        return 0;
    }
    
    // 回调函数
    void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
    {
        for (size_t i=0; i<arraySize; i++)
            array[i] = getNextValue();
    }
     
    // 获取随机值
    int getNextRandomValue(void)
    {
        return rand();
    }
     
    int main(void)
    {
        int myarray[10];
        populate_array(myarray, 10, getNextRandomValue);
        for(int i = 0; i < 10; i++) {
            printf("%d ", myarray[i]);
        }
        printf("\n");
        return 0;
    }
    
    1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值
    值传递的方式无法实现交换,因为传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销毁,并不会影响外部left和right的值。
    void Swap (int left, int right)
         int temp = left;
         left = right ;
         right = temp ;
    }
     
    2.【引用传递】如果形参为引用类型,则形参是实参的别名。
    使用引用的话,不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改时直接在原参数的基础上修改变量值,减少了复制的开销,加快程序执行效率。
    void Swap (int& left, int& right)
    {
         int temp = left;
         right = left ;
         left = temp ;
    }
     
    3.【指针传递】
    传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容。
    void Swap (int* pLeft, int* pRight)
    {
         int temp = *pLeft;
         *pLeft = *pRight;
         *pRight = temp;
    }
    

    相关文章

      网友评论

          本文标题:c指针和引用和函数指针

          本文链接:https://www.haomeiwen.com/subject/lgqiiqtx.html