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