前幾天學完了指標,今天就來做一些經典的題來鞏固自己的知識。
1.
int main()
; int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
return 0;
}
解析:首先這道題答案是2,5.因為首先它先定義乙個陣列,然後定義乙個指標變數指向下乙個陣列。a+1表示對第二個元素的位址,在解引用表示第二個元素,所以第乙個答案是2。 (&a+1)表示下乙個陣列的位址也就是ptr,所以ptr-1就是最後乙個元素的位址,在解引用就是最後乙個元素5。
2.
struct test
*p;p=0x100000
(1)p+0x1=0x100014;
(2)(unsigned long)p+0x1=0x100001;
(3)(unsigned int*)p+0x1=0x100004;
解析:首先這是乙個結構體,而它的大小為(4+4+2+1*2+2*4)=20。然後第一問,p+1就是給p所指向型別+1,所以是加20,十六進製制中20就是14,所以答案是0x100014。第二問因為將p強轉成長整型所以+1就是+1,答案是0x100001。第三問因為強轉成了int *型,所以+1就是+4,答案是0x100004。
3.
int main()
; int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr[-1],*ptr2);
return 0;
}
解析:首先定義乙個有四個元素的陣列,在定義乙個指標變數ptr1指向(&a+1)也就是下乙個陣列的位址。在定義乙個指標變數ptr2指向((int)a+1)。所以第乙個ptr1[-1]也可以寫成*(ptr1-1)也就是最後乙個元素所以答案是4。第二個*ptr2表示它所指向的值。((int)a+1)就是取4個位元組。它一開始指向的是01,後面依次是00 00 00 02 00 00 ...,所以加4就變成了0000002但是因為電腦是小端所以正確的應該是2000000。
4.
#include#includeint main(int argc,char *argv)
; int *p;
p=a[0];
printf("%d\n",p[0]);
system("pause");
return 0;
}
解析:因為定義二維陣列時用的是逗號表示式,只看括號裡後面的數,所以陣列元素應為1,3,5,0,0,0.所以p[0]表示第乙個元素,所以答案是1。
5.
int main()
解析:首先定義乙個二維陣列,開闢了空間,然後定義乙個有四個元素的陣列指標。並且&p[4][2]可以寫成*(*(p+4)+2)表示第四個元素中的第四個元素,而&a[4][2]表示第五個元素的第三個元素,所以兩個相差4個位元組,但是因為小端所以第二個答案是-4。但是位址是無符號數,所以-4的二進位制為:-4
原始碼:1000 0000 0000 0000 0000 0000 0000 0100
反碼:1111 1111 1111 1111 1111 1111 1111 1011
補碼:1111 1111 1111 1111 1111 1111 1111 1100
十六進製制:f f f f f f f c
所以第二個答案是fffffffc。
首先開闢空間。
然後進行我所說的操作,兩個所求數的位置如圖。
}解析:先定義乙個指標陣列,開闢四個位元組的空間,前三個元素分別是那三個單詞,然後定義乙個二級指標變數pa指向a。pa++因為pa指向第乙個元素的位址,在++就指向第二個元素的位址,在解引用就是第二個元素at。
7.注意:此題很經典,如果掌握了就證明你的指標就算學的不錯了。
int main()
; char **cp=;
char ***cpp=cp;
printf("%s\n",**++cpp);
printf("%s\n",*--*++cpp+3);
printf("%s\n",*cpp[-2]+3);
printf("%s\n",cpp[-1][-1]+1);
return 0;
}
解析:首先畫個圖表明現在的狀態:![](https://pic.w3help.cc/6a8/84464237904e365b5923a4462e004.jpeg)
紅色線第乙個先++,在解引用,如圖最後指向了point。
黃色線。第二個先給cpp++往上走一位,在解引用到*c,在--向上移一位,在解引用到enter再加3,結果就是er。
綠色線。第三個因為cpp本身沒變所以是虛線,先進行cpp[-2]就是*(cpp-2)到*c,在解引用到first,在+3到st。
藍色線。第四個相當於*(*(cpp-1)-1)+1。先cpp-1往下移一位解引用到cp在-1往上移一位在解引用到new,在加1得到ew。
陣列練習題
2 隨機生成乙個五位以內的數,然後輸出該數共有多少位,每位分別是什麼 3 開發乙個標題為 flipflop 的遊戲應用程式。它從1計數到100,遇到3的倍數就替換為單詞 flip 5的倍數就替換為單詞 flop 既為3的倍數又為5的倍數則替換為單詞 flipflop 5 生成13位條形碼 ean 1...
陣列的練習題
練習1 從乙個整數陣列中取出最大的整數,最小整數,總和,平均值 宣告乙個int型別的陣列 並且隨意的賦初值 int nums 宣告兩個變數用來儲存最大值和最小值 int max int.minvalue nums 3 minvalue int所能表示的最小值 int min int.maxvalue...
dfs相關練習題
給定整數序列a1,a2,an,判斷是否可以從中選出若干個數,使它們的和恰好為k 輸入 n 4 a k 13 輸出 yes 13 2 4 7 public class 部分和 int k sc.nextint kk k dfs a,k,0,newarraylist public static void...