題目是:
int a[2][2][3]= ,},,}};int *ptr=(int *)(&a+1);
printf(「%d %d」, *(int*)(a+1), *(ptr-1));
輸出結果為: 7 12
解析 先看兩個公式&a+i=a+i*sizeof(a); a+i=a+i*sizeof(a[0]);
int *ptr=(int*)(&a+1);首先是指向陣列a的最後乙個元素的下一位,接著是用(int*)進行型別轉換,把三維陣列轉換為一維陣列,這是後ptr指標指向的就是乙個一維陣列
那麼在接下來輸出*(ptr-1)的時候指標往前移動乙個元素,
*(int*)(a+1); (a+1)相等於a+sizeof(a[0])=a+6,此時a+6指向的是元素7,接著是(int*)把(a+1)從三維陣列轉換為一維陣列,最後是位址解析輸出結果,如果不用(int*)也可以直接用***即*(int*)(a+1)等價於***(a+1)
在上面題的基礎上增加兩條輸出語句:
cout<<**(*a+1)《輸出:4 1int a[2][2][3] = , },, } };
cout << ***a << endl;//輸出1
cout << *(**a + 1) << endl;//輸出2
cout << *(**a + 2) << endl;//輸出3
cout << *(*(*a + 1)) << endl;//輸出4
cout << *(*(*a + 1)+1) << endl;//輸出5
cout << *(*(*a + 1) + 2) << endl;//輸出6
cout << *(*(*a + 1) + 3) << endl;//此時是會輸出7的,原因同上面講的一樣,此時也是指標每次只移動四個位元組的位址大小...
cout << *(*(*(a + 1))) << endl;//輸出7
cout << *(*(*(a + 1)) + 1) << endl; //輸出8
cout << *(*(*(a + 1)) + 2) << endl;//輸出9
cout << *(*(*(a + 1)) + 3) << endl;//輸出10道理同上
cout << *(*(*(a + 1) + 1)) << endl;//輸出10
cout << *(*(*(a + 1) + 1) + 1) << endl;//輸出11
cout << *(*(*(a + 1) + 1) + 2) << endl;//輸出12
cout << *(*(*(a + 1) + 1) + 3) << endl;//越界輸出垃圾值
陣列的輸出
平時用的都是echo這個函式輸出,然而對於陣列,它無法輸出陣列的詳細內容,只能個輸出特定下標的陣列元素 如 a 0 那麼我們就要換種方法來輸出陣列變數。1.print r var dump 這兩個函式都可以用來輸出陣列的詳細資訊。2.each 返回陣列中當前的鍵 值對並將陣列指標向前移動一步 用法舉...
陣列的遍歷輸出
public class text for int i 0 isystem.out.print charr i 傳統的遍歷輸出方式 system.out.println for char i charr 整體每乙個都遍歷,用此比較簡便 int arr for int i arr 二維陣列的遍歷輸出 ...
php 輸出陣列內容 php陣列怎麼輸出
php陣列的輸出方式有兩種 print r 函式和var dump 函式。1 print r 利用 print r 函式可以列印輸出整個陣列內容及結構,按照一定格式顯示鍵和元素。注意 print r 函式不僅是只用於列印,實際它是用於列印關於變數的易於理解的資訊。語法 bool print r mi...