假設有
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 代...