數組名和數組名取地址、指針數組和數組指針的區別


一,首先我們先分析下數組名和數組名取地址的區別。

      我們都知道數組名是數組的首地址,然而對數組名取地址又是什么那?看下面一段程序你就會懂的。

    #include "stdafx.h" 
    #include<stdio.h>
    using namespace std;
    void main()
    {
          int a[5];
          printf("%d\n", a);
          printf("%d\n", &a);
          printf("%d\n", a + 1);
          printf("%d\n", &a + 1);
          printf("%d\n", &a[0] + 1);
          printf("接下里判斷下數組a和&a的字節大小\n");
         printf("%d\n", sizeof(a));
         printf("%d\n", sizeof(a));
        while (1);
    }

   

   分析:由運行結果可知,數組名a和&a的內存地址相同,我們已經知道a=&a[0],所以有a+1指向數組中下一個元素(即為在首地址2751180基礎上加int的字節數4)。

然而&a代表的不是取常量a的地址,而是取數組的地址。雖然a和&a的內存地址相同,但是他們的意義不相同,前者僅代表數組的首地址,后者代表整個數組的,他的進價單位是整個數組的字節長度(4*5=20),所以&a+1的內存地址為2751200。另外當用sizeof時,由於它是個關鍵字,而不是函數,所以數組不會自動轉換為指針,得到的結果都是數組的長度(4*5=20)。PS:如果是(int)a+1則結果是27511801;

二,數組指針和指針數組的區別。

   數組指針 int (*Parray)[10]=&arr;首先()優先級比較高,所以Parray是一個指針,指向一個整形的一維數組,數組的長度為10,比如int arr[10]={0,1,2,3,4,5,6,7,8,9};  

   如要將二維數組賦給一指針,應這樣賦值:
  int a[3][4];
  int (*p)[4]; //該語句是定義一個數組指針,指向含4個元素的一維數組。
  p=a;        //將該二維數組的首地址賦給p,也就是a[0]或&a[0][0]
  p++;       //該語句執行過后,也就是p=p+1;p跨過行a[0][]指向了行a[1][]

所以數組指針也稱指向一維數組的指針,亦稱行指針。

   指針數組 int *Parray[10]  []優先級高,先與Parray結合成為一個數組,再由int*說明這是一個整型指針數組,它有10個指針類型的數組元素,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM