指標和陣列相關的練習題。

2021-08-20 05:11:57 字數 3124 閱讀 6382

前幾天學完了指標,今天就來做一些經典的題來鞏固自己的知識。

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;

}

解析:首先畫個圖表明現在的狀態:

紅色線第乙個先++,在解引用,如圖最後指向了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...