有如下語句 int a[10] = {1,2,3,4,5,6,7,8,9,10};int *p = a;則數值為9的表達式是______
*p+9 b) *(p+8) c) *p+=9 d) p+7
解析:B
數組的下標是從 0 開始的,9 在 a [ 8 ] 這個位置上,p當前指向 a [ 0 ] ,所以需要向后移動8位,a和c 都是移動9位,d是地址偏移 7 位 .
若有定義語句:int a[3][6];按在內存中存放的順序,a數組的第10個元素是_____
a[0][3] b) a[1][4] c) a[0][4] d) a[1][3]
解析:D
這個二維數組的正確理解方式應該是 : 定義了一個名字為a的數組,a數組里面有三個元素,每個元素包含6個int類型的變量,數組的第十個元素應該是a[0][6]之后的a[1][3],這個知識點的考察點在於要認識二維數組中的元素和指針都是怎么存儲和指向的,指針是如何偏移的。
以下數組定義中錯誤的是______
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
第一個中括號表示數組當中元素的個數,第二個中括號表示每個元素中(類似一維數組的)變量的個數。
在定義二維數組的時候第二個中括號(元素的個數)是必須被定義的。B中等號右邊的正確定義應該是a[][2].
若有說明:int i,j=2, *p=&i;, 則能完成i=j賦值功能的語句是_____
A)*p=*&j; B)i=*p C)i+&j; D)i=**p;
解析: A
下列程序的運行結果是______
int main()
{
int a[5][2] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int* p = a; //p指向0 ,偏移量是int字節
int (*p2)[2] = &a[1]; // p2指向{2,3}中的首地址,偏移量是int*[2]字節(兩個int字節)
++p; //p向后偏移一個int字節 指向1
++p2; //p2向后偏移兩個int字節 指向4
printf("%d\n", *p);
printf("%d\n", **p2);
printf("%d\n", p2[1][2]); //p2 先向后偏移一個int*2字節(兩個int) p2[1]再向后偏移兩個int字節得到p2[1][2] 指向8
return 0;
}
下面的程序輸出結果為________
#include <stdio.h>
int main()
{
int a[] = {10,20,30,40,50};
int *p = (int*)(&a+1); // &a的含義為a[]的地址,偏移量為5個int *p指向50后面的一個元素
printf("%d %d\n",*(a+1),*(p-1)); // a為首元素的地址,偏移量為一個,所以指向20 p-1指向50的地址,間接引用后的結果為50
return 0;
}