试题视频解析 郝斌C语言p180

  1. 什么叫分配内存,什么叫释放内存
    操作系统把某一块内存空间的使用权利分配给该程序

操作系统把分配给该程序的内存空间的使用权利收回,该程序就不能够再使用这一块空间,这叫释放内存

附注:释放内存不是把该内存的内容清零

  1. 变量为什么必须得初始化
    不初始化,则变量通常是垃圾值
  1. 详细说明系统是如何执行: int i =5; 这个语句的
    1>编译器 软件请求操作系统为i分配存储空间
    2>操作系统会在内存中寻找一块空闲的区域,把该区域当做i来使用
    3>编译器会把i和这块空闲区域关联起来,今后对字母i操作就是对这块空闲的区域操作
    4>把5存储到字母i所关联的内存区域中

附注:所谓内存区域也就是内存的一块存储单元

  1. 请详细列出C语言所有的基本类型
    int
    long int
    short int
    char
    float
    double
  1. 在printf函数中int用%d输出,请问:long int, char, double , float分别用什么输出?

%ld %c %lf %f

  1. 函数的优点是什么?
    避免重复性操作(减少代码量)
    有利于程序的模块化

  2. 什么是指针,什么是地址,什么是指针变量,三者之间是什么关系?
    地址是内存单元的编号,指针就是地址,指针和地址是同一个概念
    指针变量就是存放内存单元编号的变量
    指针变量和指针是两个完全不同的概念,只不过人们有时候会把指针变量简称为指针

  3. 请写出静态变量和动态变量的异同
    相同:都需要分配内存

不同点:

  • 静态变量是由系统自动分配,自动释放,程序员无法在程序运行的过程中手动分配,也无法在程序运行的过程中手动释放
    静态变量是在栈中分配的
    只有函数终止之后,静态变量的存储空间才会被系统自动释放

  • 动态内存是由程序员手动分配,手动释放,程序员可以在程序运行的过程当中手动分配,也可以在程序运行的过程中手动释放
    动态变量是在堆里面分配的
    程序员可以在函数执行的过程当中的任何一个时刻手动释放动态变量的空间,不需要等到函数终止时才释放

  1. C语言中哪些知识点是我们学习的重点,请一一列举出来
    流程控制 函数 指针 静态内存和动态内存

  2. 1
    2
    3
    4
    5
    6
    7
    8
    9
    for (1;2;3)
    A;
    B;

    1> 2成立,会继续执行哪个语句___ A
    2> 3执行完毕后,会继续执行哪个语句____ 2
    3> A执行完毕后,会继续执行哪个语句____ 3
    4> 1总共会执行几次_____ 1

  3. 1
    2
    3
    4
    5
    6
    7
    for(1;2;3)
    for(4;5;6)
    {
    A;
    B;
    }
    C;

    1> 6执行完毕后,会继续执行哪个语句____5
    2> 5成立,会继续执行哪个语句______ A
    3> 5不成立,会继续执行哪个语句____ 3
    4> 2不成立,会继续执行哪个语句_____ C
    5> 2成立,会继续执行哪个语句___ 4
    6> A和B语句是否一定会被执行_____ 不一定
    7> C语句是否一定会执行______ 一定

  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(1;2;3)
    {
    while(4)
    5;
    6;
    if(7)
    8;
    9;
    }
    10;

1> 5执行完毕后,会继续执行哪个语句___4
2> 如果8是break语句,则8执行完毕之后会继续执行哪个语句___10

break终止的是包裹它最近的循环(要包裹break语句在内的循环,而不是while)
3> 如果7不成立,会继续执行哪个语句___9

  1. 判断下列程序语法上是否有错误,正确的打√,错误的打X,并说明出错的原因:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    A: int *p; *p=10;  ×  

    *p表示的是以p的内容为地址的变量,p的内容现在是垃圾值, 所以是把10赋给了一个不知道的单元

    B: char*p; char ch = A; p = &ch; x

    'A'单个字符必须用单引号括起来

    C: int i,j; i=j=0; int *p; p=&i; √

    i=j=k=5 是从右向左执行的
    k=5 然后 5赋给j 然后i=5

    D:int *P; int **q; q=&i; √

    int** q,能存放int*类型地址
    int* p,表示p只能存放int类型地址
    p是int*类型,则&p就是int**类型,q也是int**类型,一致,所以正确

    E: int* p;int i=5; p =&i; *p=10; √

    p把整型地址放到i里面 *p就是i,所以正确



  2. 编程实现:如果x大于0,则y为1.如果x小于0,则y为-1,如果x等于0,则y为0,以下程序段中不能根据x值正确计算出y值得是_______C,D

1
2
3
4
5
6
7
8
9
10
11
12
A>                          B>
if(x>0) y=1; y=0;
else if(x==0) y=0; if(x>0) y=1;
else y=-1; else if(x<0) y=-1

C> D>
y=0; if(x>=0)
if(x>=0); //空语句 if(x>0) y=1;
if(x>0) y=1; else y=0; //else只能对应它最近的if



  • 重点:else只能对应它最近的if
  1. 若变量已正确定义,有以下程序段
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int a=3,b=5,c=7;
    if(a>b) a=b; c=a;
    if(c!=a) c=b;
    printf("%d,%d,%d\n",a,b,c);
    其输出结果是__________B
    A.程序段有语法错误 B.3,5,3
    C.3,5,5 D.3,5,7


    解析:
    if(a>b) a=b; c=a;是两个语句
    a=3,b=5,c=7
    a>b为假,不执行.a=3赋值给c
    a=3,b=5,c=3
    if(c!=a)c不等于a则为真,否则为假.a=c=3,语句为假,跳过
    所以输出a,b,c
    3,5,3

注:C语言中!是逻辑非运算符,在前表示取非.a!=b表示a不等于b为真,否则为假

  1. 执行以下程序后,输出’#’的个数是___6_____
1
2
3
4
5
6
7
8
9
10
11
12
# include <stdio.h>

int main(void)
{
int i,j;
for(i=1; i<5; i++)
for(j=2; j<=i; j++)
printf("%c\n", '#');

return 0;
}

解析:
i j
1 2
2 2 #
3 2 #
3 3 #
4 4
4 2 #
4 3 #
4 4 #

注意:易错点
for(j=2; j<=i; j++)每次i++的时候,j都要重新赋值为2

  1. 有以下程序
1
2
3
4
5
6
7
8
9
10
# include <stdio.h>
main()
{
int i,s=0;
for(i=1;i<10;i+=2)
s+=i+1;
printf("%d\n",s);
}


注意:i+=2 等同于 i=i+2 i+2的值赋给i

程序执行后的输出结果是__D____
A.自然数19的累加和
B.自然数1
10的累加和
C.自然数19中的奇数之和
D.自然数1
10中的偶数之和

解析:
i s
0 0
1 2
3 6
5 12
7 20
9 30
输出s=30
2,4,6,8,10之和为30,所以选D

  1. 若一些定义和语句
    1
    2
    3
    4
    5
    int a=4,b=3, *p, *q, *w;
    p=&a;
    q=&b;
    w=q;
    q=NULL;
    则以下选项中错误的语句是_____
    A.*q=0; B.w=p; C.*p=88; D.*p=*w;

A错:不能改写0号单元内容

接p182