程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於C語言中對數組取址的問題

關於C語言中對數組取址的問題

編輯:關於C語言

關於C語言中對數組取址的問題,詳見補充:   如下: 定義一個數組INT8U a[4];然後對它進行強制轉換(暫時不用考慮大小端的問題啊),有三種寫法: 1,*(INT32U *)a; 2,*(INT32U *)(&a[0]); 3,*(INT32U *)(&a); 請問第3種寫法是否正確?我認為是錯誤的,但是為什麼編譯和實際運行都沒有問題?如果是正確的,該如何理解?   解答:  (a)        是一維數組首地址, (&a[0])  還是一唯數組首地址 與(a)等價 (&a)      二唯數組首地址,其一唯的寬度就是數組a的元素個數首地址值是相同的,而你都做了強制轉換,所以看不出差別 如果用以下方法,就可以看出差別了 printf("%x ", (void *)(a+1) );        //==&a[1] printf("%x ", (void *)(&a[0]+1) ); //==&a[1] printf("%x ", (void *)(&a+1)  );    //==&a[sizeof(a)+1] 追問,我定義的是一維數組,如何理解(&a)變成二唯數組首地址了呢?是編譯器的默認處理嗎?  回答 a本來就只是一個數組的首地址,不是指針變量,但相當於一唯指針,對它取地址,系統會讓為是把這個數組整體當一個元素而得到的指針,這指針首地址沒變,而做+1等地址運算時,是直接以整個數組為元素向後移指針的,這種行為就說明它是比這個a多一唯層了應當是編譯器處理的規則,,更且體的歸納如下:int i;           i只是一個0唯的(只有一個元素)int *p=&i;       此時p可以算是比i多一唯層,也就是可以當作一唯數組,指向0唯元素int **p2 = &p;    看得出p是或相當於一唯數,而&p卻是又多一唯層,屬於二唯,指向1唯元素int ***p3 =&p2;    很明顯,對二唯指針取地址得到的是三唯的指針....指向二唯元素......數組名和指針的區別在於,數組名是const型指針,不能對指針本身賦值,不能改變指針本身除此之外兩者有區別嗎,沒有,所以,對於 int a[4];  a是一唯的指針(常量), &a當然是成了二唯的指針類型了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved