c語言中數組名和指針變量的區別


編譯器工作原理:在64位的計算機中,當創建一個指針變量時,計算機會為它分配8個字節的存儲空間。但如果創建的是數組呢?計算機會為數組分配存儲空間,但不會為數組變量分配任何空間,編譯器僅在出現它的地方把它替換成數組的起始地址。

結論1:由於計算機沒有為數組變量分配空間,也就不能把它指向其他地方。例題:

char s[]="How big is it?";
char *t=s;   //正確,將數組的地址賦給指針變量t
s=t;        //錯誤,數組變量沒有存儲空間,無法存儲指針變量t的值,編譯報錯

結論2:如果對數組變量使用取地址符&,結果是數組變量本身。

#include <stdio.h>
int main(int argc, char *argv[])
{
    int arr[3]={1,2,3};
    printf("arr=%p\n",arr);
    printf("&arr=%p\n",&arr);

    return 0;
}

結果為:
fly@noi:~$ ./t
arr=0x7ffed97ce8d0
&arr=0x7ffed97ce8d0

結論3:sizeof(數組)的值是數組的大小,sizeof(指針)是操作系統上一個地址的大小,64位機上是8個字節,32位機上是4個字節。

#include <stdio.h>
int main(int argc, char *argv[])
{
    int arr[3]={1,2,3};
    int *p=arr;
    printf("sizeof(arr)=%d\n",(int)sizeof(arr));
    printf("sizeof(p)=%d\n",(int)sizeof(p));

    return 0;
}

輸出:
fly@noi:~$ ./t
sizeof(arr)=12
sizeof(p)=8

通過結論3可知:假如把數組變量賦給一個指針,那么指針變量只會包含數組的地址信息,而對數組的長度一無所知,相當於指針丟失了一些信息。我們把這種信息的丟失稱為退化。只要把數組變量傳遞給函數,數組免不了退化為指針,所以,把數組傳遞給函數,需要明確的指明數組的大小。向這樣:

int arr[3]={1,2,3};
int sum_arr(int arr[],int n);   //用整型變量n明確指出數組大小

 


免責聲明!

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



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