當a為陣列時a和 a還是有區別的

2021-09-30 06:09:33 字數 1377 閱讀 9715

假設有

int a;那麼a

實際上是陣列

a的首元素

a[0]

的首位址,而

&a是陣列的首位址,其值和

&a[0]

相等,但是兩者的意義不同,這一點可以從指標的移動運算方面得到驗證。且看下面程式:

#include

int main();

int *ptr=(int *)

(&a+1

);//

強制型別轉換,將其轉換為指向整型變數的指標(也可以不轉換)

printf("%#0x,%#0x,%#0x,%#0x,%#0x/n",a,a+1,&a,&a+1,ptr);

printf("%d,%d/n",*(a+1),*(ptr-1));

return 0; }

上述程式的輸出結果為:

0x12ff6c,0x12ff70,0x12ff6c,0x12ff80, 0x12ff80

2,5對上述結果的分析如下:

對指標進行加

1操作,得到的是下乙個元素的位址而不是原有位址值直接加

1。乙個型別為

t的指標的移動,以

sizeof(t)

為移動單位。上述程式中,

a是乙個一維整型陣列,有

5個元素。 a

是陣列a

的首元素的首位址相當於

&a[0]

,a+1

是陣列a

的下一元素的位址,即

&a[0]+sizeof(int)

。&a+1

的含義是取陣列

a的首位址,該位址的值加上

sizeof(a)

的值,即

&a+5*sizeof(int),

也就是下乙個陣列的首位址,顯然已經超過了陣列的界限。

(int *)(&a+1)

是把上一步計算出來的位址強制轉換為

int *

型別,賦值給

ptr。

*(ptr-1)

的值怎麼算呢?

ptr-1

實際上指向

a[4]

,因此*(ptr-1)

的值為5。

下面是程式除錯時,上述各個位址的值。這裡有乙個問題就是除錯視窗顯示的

&a+1

的值為什麼和

printf

列印出來的不一樣?原因就是,當你把

&a+1

放到watch

視窗中觀察其值時,表示式

&a+1

已經脫離了它的上下文環境,編譯器就很簡單地把它解析為

&a的值然後加上

1byte

,而a+1

卻是正確的,這可能是

vc的乙個

bug。  

部落格,網誌,和使用者空間,還是有很大的區別的

軟體世界的牛虻技術專欄 部落格是乙個好東西 部落格 blog 和網上日記 webdiarty 個人空間 userspace 這幾個網上新玩意最初都源自乙個單詞web log,即今天說的weblog,簡化成了blog,但其實是有著很大的區別的。筆者寧願把它分區分起來,因為,這幾者在託管商的業務模式來說...

2019 08 03 自卑和悲觀是有區別的

08 10 昨晚9點的高鐵,來到孩子身邊已經超過凌晨了。她已經在外婆家玩了兩個星期了,是時候要接回奶奶家了。對於女兒來說,都無所謂,只要有吃的和玩的都能行。乙個如此 簡單 的孩子,心裡充滿的只有快樂和快樂。成功的生活需要大部分時間的樂觀和偶爾的悲觀。輕度的悲觀使我們在做事之前三思,不會做出愚蠢的決定...

JS陣列內建遍歷方法有哪些和區別

js陣列內建遍歷 遍歷就是迴圈的意思 方法主要有 foreach 這個方法是為了取代for迴圈遍歷陣列的,返回值為undefined 例如 let arrinfo 4,6,6,8,5,7,87 arrinfo.foreach item,index,arr 其中 item 遍歷的每一項 index 代...