日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

函数参数传递、数组指针、二级指针、左值、引用

發布時間:2024/7/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数参数传递、数组指针、二级指针、左值、引用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數組和指針的區別

  • 數組內地址一定連續,指針則不一定連續。
  • 數組賦值要么初始化就設定,要么循環元素賦值。而指針隨時可以賦值(改變指向)。
  • 數組的存儲空間,不是在靜態區就是在棧上。指針位置隨意。
  • sizeof(數組名)= 元素個數*sizeof(元素類型) 字節;而sizeof(指針) = 4字節(32位平臺) 或 8字節(64位平臺)
  • 可以把二維數組數組名看作一個二級指針常量鏈接
    數組(名)是右值,而指針是左值?
    例:

    數組和指針是等效關系不是等價關系,一說指針對象,而數組非對象。
  • 一維數組和指針很多時候可以通用如:
    p[i] ? *(p+i)
    &p[i] ? p+i

    二維數組分配 ※

    二維數組(指針)動態分配和釋放
    malloc工作只是開辟一塊你要的內存(連續的),同時返回內存首字節的地址,但是他不限定你內存里的內容,malloc( 5*sizeof(char) ) 只是給你空出一段20字節的內存空間,并且給你他的首地址,而你實際要往內存里裝什么,完全通過強制類型轉換來限定,比如 int**p=(int**)malloc(n*sizeof(char*))
    動態分配基本都要用到指針數組。

    //二維都已知 char (*a)[N];//數組指針a = (char (*)[N])malloc(sizeof(char *) * m);printf("%d\n", sizeof(a)); //4,指針printf("%d\n", sizeof(a[0]));//N,一維數組free(a); //二維未知 char **a;//二級指針int i;a = (char **)malloc(sizeof(char *) * m);//分配二級指針空間for(i=0; i<m; i++){a[i] = (char *)malloc(sizeof(char) * n); //分配一級指針空間,不保證a[0],a[1],...a[m]的值連續}printf("%d\n", sizeof(a)); //4,指針printf("%d\n", sizeof(a[0])); //4,指針for(i=0; i<m; i++){free(a[i]);}free(a); //二維未知,連續內存 //法1(自上而下) char **a;int i;a = (char **)malloc(sizeof(char *) * m);a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空間for(i=1; i<m; i++){a[i] = a[i-1] + n;}//采用如上內存分配方法,意味著將a的值初始化為m*n的二維數組首地址,且這塊內存連續printf("%d\n", sizeof(a)); //4,指針printf("%d\n", sizeof(a[0])); //4,指針free(a[0]);free(a); //二維未知,連續內存 //法2(自下而上、逆向思維)double *Array1D=new double[n*m];double **Array2D=new double* [n];for(int i=0;i<n;i++){Array2D[i]=&Array1D[i*m];}delete[] Array2D[0];//或Array1Ddelete[] Array2D;

    法2參考
    兩種方法的差異在于后者需要兩個變量名,而第一種由于直接對元素賦值,中間指針數組并不需要命名。

    注意內存的釋放都是先釋放低級的,再釋放高級的。
    此外,指針數組首地址不等于二維數組首地址,說明指針數組塊和二維數組塊不是重疊的,都有分配各自的空間。如圖:

    二維數組參數傳遞

    傳遞的三種方法

    指針的偏移量問題

    • 指針的偏移量=指針的當前值+n*sizeof(指針指向的數據類型)
      如 ? ?int (*a)[3]={0}; a是一個數組指針,a+1的偏移量是12個字節
      又如

    • 二維數組指針

    int a[3][4],*p; p=(int*)a;//將二維數組強制類型轉化為一級指針,p++可以到12

    左值和右值

    左值(lvalue):一個標識非臨時性對象的表達式。通常來說,可以將程序中所有帶名字的變量看做左值
    右值(rvalue):相對的,右值標識是臨時性對象的表達式,這類對象沒有指定的變量名,都是臨時計算生成的。

    引用

    (1)左值引用
    左值引用的聲明是通過在某個類型后放置一個符號&來進行的。前文代碼中的int & y = x;便是一個左值引用。
    需要注意的是,在定義左值引用時,=右邊的要求是一個可修改的左值。
    (2)右值引用(不常用)
    類似于左值引用,右值引用便是對右值的引用,它是通過兩個&&來聲明的

    引用和指針有什么區別

    我們知道,指針是在內存中存放地址的一種變量,cpu能夠直接通過而變量名訪問唯一對應的內存單元,且每個內存單元的地址都是唯一的。
    而變量名和引用,都可以看做內存的一個標簽或是標識符,計算機通過是否符合標識符判斷是否為目標內存,而一個內存可以有多個標識符


    參考:https://www.cnblogs.com/Bylight/p/10530274.html

    總結

    以上是生活随笔為你收集整理的函数参数传递、数组指针、二级指针、左值、引用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。