這道題目是我在面試的時候碰到的。當時面試官問我的時候,由於我什麼基礎都比較差,我聽到這個問題的時候整個人都傻了。我心想當時學c語言的時候,我只記得老師說這個都代表a陣列的首位址啊,這有什麼區別呢?這道題目,我最終沒有答出來,都怪我太菜了。今天這篇文章就當做是乙個記錄吧,也希望能給還不q清楚的同學一點分享。
我們先看一段**
#includeusing namespace std;
int main()
;int *ptr=(int *)(&a+1);
cout<
}
我直接給出輸出結果:
*(a + 1) = 2 *(ptr – 1) = 5
這是為什麼呢?*(a + 1) = 2這個結果我們很好理解,為什麼*(ptr – 1) = 5?
原因是a代表陣列a的首位址,而&a代表的是整個陣列a的位址,因而他們本身的值是一樣的。但是當它們分別進行加1的時候,這個就完全不同了。如下圖所示:
由上圖可以很清晰的看到,由於&a代表的是整個陣列的位址,因此&a + 1就到了如圖所示的位置。那問題又來了,那為什麼*(ptr – 1) = 5呢?加1到了未知的第一點,那減1不應該是回到陣列的起始位置了嘛?事實上,這個猜測是錯誤的,因為&a+1指向未知的第一點,當把其賦值給ptr之後,ptr又退化成了乙個普通的指標,就像a一樣,減一之後回到了陣列的尾部。
好,這樣講,是不是清楚了一些?為了驗證我們的判斷,下面我們將a和&a等位址值直接列印出來,用資料說話。請看下面一段**
#includeusing namespace std;
int main()
; cout<
a=0xbfdc272c
a+1=0xbfdc2730
sizeof(*a)=4
sizeof(a)=20
a+1=0xbfdc273c
&a=0xbfdc272c
&a+1=0xbfdc2740
sizeof(int)=4
&a+1=0xbfdc290c
我們來分析一下這個結果,&a和a同樣指向陣列a的起始位址,&a + 1指向第乙個未知。由於陣列a有五個資料,乙個int型的資料為4個位元組,所以&a + 1相比&a而言加了20個位元組。後面一樣分析,如果是&a + 2那麼就加40個位元組了。怎麼樣?清楚了吧???哈哈哈。。。。。
#includeusing namespace std;void main() ;
int (*p)[5];
cout<
結果:a type = int *
&a type = int (*)[5]
p type = int (*)[5]
我們再次清楚的認識到,原來&a和p一樣是乙個指標陣列,這下都清楚啦吧。哈哈。。。。。
參考資料:
測試平台:www.anycodex.com
機會只留給有準備的人。加油!
mysql的 和 的區別 和 的區別
他們之間的區別用最直接的話來說就是 相當於對資料 加上 雙引號,相當於直接顯示資料。1 對傳入的引數視為字串,也就是它會預編譯select from user where name 比如我傳乙個csdn,那麼傳過來就是select from user where name csdn 2 將不會將傳入...
and和or的區別
題目 求結果 a.1 or 2 b.1 and 2 c.1 2 2 d.1 2 2 結果 a 1 b 2 c 0 d 1 總結and和or的用法 and 從左到右,返回第乙個為假的表示式值,無假值則返回最後乙個表示式值。or 從左到右,返回第乙個為真的表示式值,無真值則返回最後乙個表示式值。備註 感...
a 和 a的區別
void main int ptr int a 1 printf d,d a 1 ptr 1 列印出來的值為多少呢?對指標進行加 1 操作,得到的是下乙個元素的位址,而不是原有位址值直接加 1。所以,乙個型別為 t 的指標的移動,以 sizeof t 為移動單位。因此,對上題來說,a 是乙個一 維陣...