数组笔试题

有如下语句 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++ 可以 因为是变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值