1. 程式人生 > >關於數組和指針的一道例題的解讀

關於數組和指針的一道例題的解讀

2個 amp 默認 含義 改變 一個 bsp 編譯器 取地址

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a[3]={1,2,3};
    int (*pa)[3];
//  *pa=a; //錯誤,因為pa沒有被賦值,怎麽取值,語法錯誤。
    pa=&a; //正確,&a為指向數組的地址,和pa類型匹配
    printf("*pa=%p\n",*pa); //正確,*pa含義為:對pa解引用,得到數組a的地址。
    printf("*pa+1=%p\n",*pa+1); //正確,*pa+1:先計算*pa(相當於數組名,默認被編譯器自動轉換為數組>首元素首地址)得到數組首元素地址,然後加1,移動4個字節
printf("*(pa+1)=%p\n",*(pa+1)); //正確,*(pa+1):先計算(pa+1),因為pa為數組首地址(註意不是數組首 元素地址)類型是整個數組,所以(pa+1)移動了整個數組的字節數,也就是12個字節。 printf("&*pa=%p\n",&*pa);//正確,由這個可以看出(*pa)被編譯器看作是數組名,因為對數組名取地址得>到的指針類型是整個數組結構。 printf("&*pa+1=%p\n",&*pa+1);//結果是移動了12個字節,表明(&*pa)為指向數組的指針。 // *pa=a;
//錯誤,因為(*pa)為數組a的地址,是一個地址直接量,不可以改變。 // *pa=&a; //error // *pa=&a[0]; //error // *pa=*pa+1; //錯誤,同理(*pa)為一個地址直接量,不是左值,不能進行自加運算。 *pa++; //正確,自加的是pa不是(*pa),不信你可以試試:(*pa)++ printf("*pa=%p\n",*pa); return 0; }

關於數組和指針的一道例題的解讀