• C中指针符*和取址符&


    学习了C语言之后,关于指针部分看了无数遍,有时候明明觉得自己看懂了,指针就是地址,但是总是在看代码时候糊里糊涂的搞不明白,最近又关于指针强化了一把。

    大部分情况下对于程序中指针糊涂是因为不明白指针符“*”有两个作用:

    第一,作为标识符,定义变量为指针,如int *p;//只是说明变量p是指针变量,而没有实际意义。

    第二,作为运算符,像+,—,运算符一样,如cout<<*p;//输出指针变量p所指向的内容。

    一般在程序中,第一次出现的指针符*,是作为标识符,申明指针变量,之后出现是作为运算符,但也不一定,主要还是看程序语境。

    而“&”符号是一元运算符,取变量地址。

    好了,关于指针我目前使用最多的是作为参数传递。由于自己研究图像处理,程序中往往要处理上千的图片,内存常常溢出,内存分配尤其重要,这时候我被迫学习了指针的使用。

    面向对象编程函数传递往往是值传递,但是值传递的形参是实参的拷贝,如果此时我用值传递,上千张图片在内存中再拷贝一份可想而知,所以考虑用指针传递。

    //指针传递
    
    void swap(int *a,int *b)
    {
         int temp;
         temp=*a;
         *a=*b;
         *b=temp;
         cout<<*a<<‘  ’<<*b<<’
    ’;
    }
    
    int main(){
        int x=1;
        int y=2;
        swap(&x,&y);
        cout<<x<<‘  ’<<y<<’
    ’;
    
    }
    //输出2 1 , 2 1
    

      

    上段程序中,实参传递的是x,y 的地址,形参定义a,b为指针变量,a,b内容为x,y地址的拷贝,程序中*a,*b是x,y地址所指向的内容,即为x,y。

    所以程序中操作的也是x,y本身,此程序不需要重新在内存中开辟新的空间,之间操作实参本身。

    另一种传递方式,引用传递,作用和指针传递一样

    //引用传递:
    
    void swap(int &a,int &b)
    {
         int temp;
         temp=a;
         a=b;
         b=temp;
         cout<<a<<’ ‘<<b<<’
    ’;
    }
    
    int main(){
        int x=1;
        int y=2;
        swap(x,y);
        cout<<x<<’ ‘<<y<<’
    ’;
        return 0;
    }

    上段代码跟指针传递结果一样,均输出2 1 , 2 1

    函数调用形式跟值传递一样,但是被调用函数的形参则引用x,y 的地址,函数中操作的也是x,y本身。

  • 相关阅读:
    Xshell初步设置
    【R shiny】一些应用记录
    R shiny 小工具Windows本地打包部署
    生信工程师如何写一个小工具?
    Android 照片墙应用实现,再多的图片也不怕崩溃
    Android 高效加载大图、多图解决方案,有效避免程序OOM
    SparseArray 详解
    ActivityThread
    Activity 启动模式详解 (activity 加载模式)
    Activity 生命周期
  • 原文地址:https://www.cnblogs.com/diaozhaojian/p/7220768.html
Copyright © 2020-2023  润新知