指针相关博客
第一题
1. 以下关于 typedef 正确的描述是()【多选】
A:用typedef可以定义各种类型别名,但不能定义变量
B:用typedef只是将已存在的类型用一个新的名称代替
C:用typedef可以增加新类型
D:使用typedef便于程序的通用
答案及解析 ABD
typedef只是给已经存在的类型起别名,可以将复杂的类型简单化;并不是新增类型;
第二题
2. 对于以下递归函数f,调用f(4),其返回值为()
int f(int n) { if(n) return f(n - 1) + n; else return n; }
A:10
B:4
C:0
D:以上均不是
答案及解析 A
本题考查的是递归,遇到递归计算,按步展开:
f(4) = f(3) + 4
= f(2) + 3 + 4
= f(1) + 2 + 3 + 4
= f(0) + 1 + 2 + 3 + 4
= 0 + 1 + 2 + 3 + 4
= 10
第三题
3. 下面程序的输出为()
#include <stdio.h> int main() { char *ptr; char arr[] = "12345678"; ptr = arr; ptr += 5; printf("%s", ptr); return 0; }
A:5678
B:678
C:编译错误
D:其它选项都不对
答案及解析 B
ptr指针最开始指向数组arr的首元素地址,ptr += 5,是对指针的加法运算,需要根据自身数据类型char*,所以往后移动的是5个字节,就到6的地址,对ptr打印直接输出678,因为printf函数会去寻找字符串的\0,遇到\0结束打印。
第四题
4. int类型的二维数组X按行顺序存储
X[4][4] 的存储地址为 0xf8b82140
X[9][9] 的存储地址为 Oxf8b8221c
则X[7][7]的存储地址为 ( )
A:0xf8b821c4
B:0xf8b821a6
C:0xf8b82198
D:0xf8b821c0
答案及解析 A
首先我们是不知道这个二维数组一行有几个元素的,所以必须要求出来一行有多少元素:而我们只知道地址,两个地址之间的差就是这两个地址之间的元素个数,这里是前闭后开的关系,也就是计算两个元素的地址差,求出来的元素个数是小地址到大地址之间的元素个数,包括小地址,不包括大地址;
假设每行有n个元素:
&X[9][9] - &X[4][4] = (21c-140) / 4 //除4是因为是int类型
&X[9][9] - &X[4][4] = 4n + (n - 4) + 9 = 5n + 7
4n :5、6、7、8行的元素个数
n - 4 :表示第5行中,第五个元素之后还有多少个元素,包括第五个元素
9 : 在第十行中,第十个元素之前的元素个数,不包括第十个元素
5n + 5 = (21c -140) / 4
5n + 5 = (540 - 320) / 4
5n + 5 = 220 / 4
5n + 5 = 55
n = 10
所以最后每行一共有10个元素;
那x[7][7]的地址 = &X[4][4] + (2n + 7 + (n - 4))*4 = 140 + 84 = 1c4
第五题
5. 以下代码在64位的机子上输出是()
#include <stdio.h> int getSize(int data[]) { return sizeof(data); } int main() { int data1[] = {1,2,3,4,5}; int size1 = sizeof(data1); int* data2 = data1; int size2 = sizeof(data2); int size3 = getSize(data1); printf("%d, %d, %d", size1, size2, size3); return 0; }
A:20, 8, 8
B:4, 4, 4
C:20, 4, 20
D:20, 20, 20
答案及解析 A
这个题就是根据昨天的题来的哦,别忘了数组传参会降为指针类型;
data1 :sizeof数组名,求的就是整个数组的大小,为20;
data2 :data2是一个int*类型,64位机器,是8字节大小;
第三个就是涉及数组传参,降为指针类型,是int*,也是8字节