陣列筆試題
有如下語句 int a[10] = {1,2,3,4,5,6,7,8,9,10};int *p = a;則數值為9的表示式是___b___
*p+9 b) *(p+8)
解 定義了指標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)
解 首先明確 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++ 可以 因為是變數