有如下语句 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;
}