C语言基础试题十道(第一期)

1.有如下说明语句:

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = a;

则数值为9的表达式是()

正确答案: B 

解析:p是指针,指向数组的首地址,p+8即是第八个元素的地址,加个*即地址中存放的值。

2.下列程序的打印结果是?

char p1[15] = "abcd", *p2 = "ABCD", str[50] = "xyz"; 
strcpy(str + 2, strcat(p1 + 2, p2 + 1));
printf("%s", str);

正确答案: D

解析:char*  strcpy(char *dest,char *src);将从src开始包含'\0'的字符串拷贝到以dest开始的位置,进行覆盖

char*  strcat(char *dest,char *src);将src开始的字符串添加到dest字符串的末尾(覆盖dest的\0")

两者都返回指向dest的指针。

3.关于引用与指针的区别,下面叙述错误的是:

A:引用必须被初始化,指针不必。

B :指针初始化以后不能被改变,引用可以改变所指的对象。

C:删除空指针是无害的,不能删除引

D:不存在指向空值的引用,但是存在指向空值的指针。

答案:D

解析:

指针在建立后会被分配一块空间,用于存储其所指向的地址,因为指针是有对应内存空间的,因此指针值(指向的内存空间)是可以改变的;而引用则不行,引用没有内存空间,仅仅是被引对象内存空间的别名,改变引用如&a=4实际上等价于a=4,改变的是被引对象的值,不改变该引用所指的内存空间;

指向空值的引用是没有意义的(因为引用对象不能改变,也就是这个引用永远指向null,那这个引用根本就没有存在的必要);指向空值的指针是有意义的,尤其在指针被删除后,如果不对指针进行赋值,则指针的值将会由系统随机指定,这样后续如果有对指针的操作的话,将会带来很大的风险。因此指针被删除后必须赋值为null;

因为引用无法改变,因此不进行初始化的引用没有意义;因为指针可以改变,因此指针可以不进行初始化,可以在后续程序中动态改变;

4.数组定义为“ int a[4];”,表达式 ( ) 是错误的。

A:*a

B:a[0]

C:a

D:a++ 

正确答案: D 

解析:a代表数组名或者内存连续区域第一块数据的地址。接[]表示基址寻址。加*表示对数组起始位置按照数组元素数据类型寻址取值第一个元素。加&表示取第一个元素地址。a与&a与&a[0]相同。a为常量,可以运算,不可赋值。 

5.若有定义 int a[3][5], i, j; (且 0≤i<3, 0≤j<5),则 a[i][j] 不正确的地址表示是()。

A:&a[i][j]

B:a[i]+j

C:*(a+i)+j

D:*(*(a+i)+j)

正确答案:D

6.代码段

1

2

int a[3][3] = {{3,5},{8,9},{12,35}}, i, sum = 0;

for (i = 0; i < 3; i++) sum += a[i][2-i];

则sum=21。请问这句话的说法是正确的吗?

答案:正确

解析:

a[3][3]={{3,5},{8,9},{12,35}};

一维数组没有初始化的值默认初始化为0,

即:a[3][3]={{3,5,0},{8,9,0},{12,35,0}};

sum = a[0][2]+a[1][1]+a[2][0] = 0+9+12 = 21。

7.

有变量

1

2

3

4

5

struct {

    char    type;

    int     num;

    char    name[10];

} rec;

char是1字节,int是4字节,若按4字节对齐,那么sizeof(rec)等于()

A:15
B:16
C:18
D:20

答案:D

解析:要符合最大字节原则  char要用int字节数  char数组要是int 4个字节的倍数 4+4+12=20

8.下面代码的循环次数为()

1

2

3

4

unsigned char limit = 150;

for (unsigned char i = 0; i < 2 * limit; ++i) {

    //in loop do something

}

A:300
B:299
C:301
D:无限循环

答案:D

解析:char类型占据一个字节,8位,2^8所以能表示256个数据,而unsigin char表示没有符号位,所以能表示的数据范围位0~255,在这种前提下,所以选D

9.

请问下面的程序最后会产生多少个进程:

1

2

3

4

5

6

7

8

9

10

11

12

13

int main( ){ 

     int i; 

     for(i = 0; i < 5;i++){ 

        int pid = fork(); 

        if(pid == 0){ 

            //do something 

        else

        //do something 

        

    }

    // do somthing,sleep

    return 0;

}

A:5
B:10
C:15
D:32

答案:D

解析: 

i=0时,共有两个进程: 主进程和主进程创建的第一个进程

i=1时,以上两个进程分别创建新的进程,此时共有四个进程

i=2时,以上四个进程分别创建新的进程,此时共有8个进程

....

依次类推, 当i=n时,共创建2^(n+1)个进程

10.

有如下程序段:

复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#include <iostream>

using namespace std;

class A {

  public:

    ~A() { cout << "~A()"; }

};

class B {

  public:

    virtual ~B() { cout << "~B()"; }

};

class C : public A, public B {

  public:

    ~C() { cout << "~C()"; }

};

int main() {

    C *c = new C;

    B *b1 = dynamic_cast<B *>(c);

    A *a2 = dynamic_cast<A *>(b1);

    delete a2;

}

则程序输出:

A:~C()~B()~A()
B:~C()~A()~B()
C:A)B)都有可能
D:以上都不对

正确答案:D

解析:

答案解析:创建一个类对象c,然后动态类型转换,让一个B *b1指针指向c,再一次动态类型转换,让一个基类A *a2指针指向b1,当delete a2时,调用析构函数,但是基类A的析构函数不是虚函数,所以只调用A的析构函数,结果应该是:~A()

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进步小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值