1. 程式人生 > >陣列筆試題

陣列筆試題

有如下語句 int a[10] = {1,2,3,4,5,6,7,8,9,10};int *p = a;則數值為9的表示式是___b___

*p+9                       b)       *(p+8)                   

c)       *p+=9                    d)       p+7

 解      定義了指標p指向陣列a的首元素的地址  1)第一個選項 *p+9 *p是對首元素的間接引用得到p中儲存的內容即一 得到的結果為10

2)第二個選項 首先指標p先向右偏移8個單位此時p指向9    然後間接引用得到九

3)同選項一

4)p向右偏移七個單位   p+7 任然代表一個指標

 

若有定義語句:int a[3][6];按在記憶體中存放的順序,a陣列的第10個元素是__d___

a[0][3]                    b)      

a[1][4]                    c)       a[0][4]                    d)       a[1][3]

 解  首先明確 int a[3][6]  代表的意義   這個二維陣列 的型別時 int [6] 型別 存了三個元素 而每個元素代表著6個數的一個集合

不難看出 第十個數 也就是存在此二維陣列的第二個元素的第四個數  根據資料下標的儲存規則 可以得出答案

 

以下陣列定義中錯誤的是__B____

                     A. int x[][3] = {0};                                 B. int x[2][3] = {{1,2}, {3,4}, {5, 6}};

                     C. int x[][3] = {{1,2,3}, {4,5,6}};        D. int x[2][3] = {1,2,3,4,5,6};

解 B 陣列所儲存的元素應該是兩個 而後面初始化 中國顯然是三個

 

若有說明:int i,j=2, *p=&i;, 則能完成i=j賦值功能的語句是_____

A*p=*&j;          B)i=*p     C)i+&j;           D)i=**p;

 解 首先定義指標p指向a  1)第一個選項 *&j等價於j  而*p 代表對a的地址作間接引用 即可以實現 i=j的賦值操作

2)*p等價於i    

3)首先並沒有賦值符號 可以首先排除 其次 i 與&j 完全不是一種型別

4)**p 代表對i再做間接引用  顯然錯誤

 

下列程式的執行結果是_1,4,8_____

int main()

{

           int a[5][2] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

           int* p = a;

           int (*p2)[2] = &a[1];

           ++p;

           ++p2;

           printf("%d\n", *p);

           printf("%d\n", **p2);

           printf("%d\n", p2[1][2]);

           return 0;

}

注  先分析 p的型別  1)由int *p=a ; 可知 p 是int 型 可以判斷出p指向0

   2)p2 的型別為int [2]型  由 int (*p2)[2] = &a[1]; 可知p是指向2,3 的指標

3)++p p指向1

4)++p2   p2指向 4,5

5)輸出*p 為 1

6)輸出 **p2   我們可將p2 看成指向一個數組的指標 當第一次間接引用的時候為首元素的地址 再次間接引用的時候就為首元素的值為4

 7)首先 說一下[]的作用1. 代表陣列的下標2. 代表指標的偏移 然後再間接引用 3.陣列傳參的時候相當於*  

p2[1][2] 開始p2 指向的是 4,5 先偏移 指向6,7 間接引用指向 6 在偏移 2個單位指向 8 間接引用取出8

下面的程式輸出結果為___20,50_____

#include <stdio.h>

int main()

{

           int a[] = {10,20,30,40,50};

           int *p = (int*)(&a+1);

           printf("%d %d\n",*(a+1),*(p-1));

           return 0;

}

 解 1)輸出兩個數 *(a+1)陣列名 代表陣列首元素的地址 偏移一個單位指向20 間接引用輸出20

     2)先分析p指標的指向    首先&a 代表整個陣列的地址 (&a+1)指向在陣列a後開闢一塊新的地址的首地址*(p-1)為50

定義函式區域性變數的時候:
char array1[100];
char *array2;
array1 和 array2 都可以當做指標引用,這兩個指標在使用的時候有什麼區別?

 區別 array1++ 不存在 因為陣列名是常量不能++

  array2++ 可以 因為是變數