C语言—每日选择题—Day59

指针相关博客

打响指针的第一枪:指针家族-CSDN博客

深入理解:指针变量的解引用 与 加法运算-CSDN博客

第一题

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:以上均不是

答案及解析  

本题考查的是递归,遇到递归计算,按步展开:

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字节

猜你喜欢

转载自blog.csdn.net/2302_76941579/article/details/135140271