C语言易错基础知识汇总

以下整理自湖南大学考研真题。

2010年

1、C语言源程序文件经过C编译程序编译连接之后生产一个后缀为“.exe”的文件

2、以下选项中不正确的整型常量是()

A、12L    B、-10    C、1,900    D、123U

3、表达式_____不符合C语言语法,若变量以正确定义并赋值

A、4&&3    B、+a    C、a=b=5    D、int(3.14)

4、在字符数组str[]="hello\nworld\n"中,‘\n’为一个字符,该数组长度为13

5、结构体的赋值:

struct node{
    char s[10];
    int k;
}p[4];

p[0]->k=2正确,p[0].s="abc"错误。

6、C语言中基本的数据类型有 整型、字符型、浮点型

7、C语言中普通整型变量的类型说明符为 int ,在内存中占 2 字节,有符号普通整型的数据范围是 -32768~32767(-2^15~2^15-1)

8、原码反码和补码:(8位,以-35为例)

原码

最高位存放符号, 正数为0, 负数为1。

例:-35 --> 10100011

反码

正数的反码是其本身;

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

例: 10100011 --> 11011100

补码

正数的补码就是其本身;

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)

例:11011100 --> 11011101

注:考试给的答案是16位。

9、所谓“指针”就是 地址 ,“&”运算符的作用是 按位与或取地址 ,“*”运算符的作用是 乘积或指针

10、文件:

建立一个名为“myfile”的文件:

FILE *fp;
fp=fopen("myfile.txt", "w");

要记住最后要关闭文件流:

fclose(fp);

11、sizeof()计算当前字符数组总元素个数,包括'\0';strlen()不包括'\0':

char s[9] = "computer";
printf("%d\n",sizeof(s));
printf("%d\n",strlen(s));

12、从键盘读取字符串的方法:

char str[100];
gets(str);
puts(str);

2011年

1、函数参数传递时传值与传地址的区别:

传值 把实参的值赋给形参,对形参的值进行修改不会影响到实参。
传地址 传递的是地址,实参和形参指向同一对象,改变形参的值实参的值也会相应改变。

2、#include <filename.h> 和 #include "filename.h"的区别:

<> 从标准头文件的位置引用头文件。(标准或系统提供的头文件)
"" 引用的是用户程序目录中相对路径里面的头文件。(程序自己的头文件)

3、sizeof()的使用:

详细可参考:https://blog.csdn.net/u011677209/article/details/52837065

#include <stdio.h>
#include <stdlib.h>

void fun(char str[100]){
    printf("3,%d\n",sizeof(str));
}

int main()
{
    char str[]="Hello";
    char *p=str;
    printf("1,%d\n",sizeof(str));
    printf("2,%d\n",sizeof(p));
    fun(str);
    return 0;
}

 如上程序,在32位系统中,输出结果为:

1,6
2,4
3,4

 (1)sizeof()的作用是返回一个对象或者类型所占的内存字节数,str数组中,加上结束符'\0'一共是6个字符,char类型占1个字节,因此共6字节。

(2)指针p记录了另一个对象str的地址,等于计算机内部地址总线的宽度。所以在32位计算机中 ,一个指针变量的返回值必定是4(注意结果是以字节为单位)。

(3)在fun()函数中,数组是“传址”的,只会把实参的地址传进去,而不会分配一个大小为100的数组,所以它实际上相当于是一个指针,因此结果也为4。

4、分析下面的程序:

#include <stdio.h>
#include <stdlib.h>

char *GetMemory(){
    char p[]="hello world";
    return p;
}

void Test(){
    char *str=NULL;
    str=GetMemory();
    printf(str);
}

int main()
{
    Test();
    return 0;
}

函数GetMemory()中返回的p是其局部变量,在该函数执行完“return p;”后p就被释放掉了,因此在Test()中str并没有获取到p的值,输出的是乱码。

5、有序数据序列的查找——二分法:

#include<stdio.h>
//递归算法
int recurbinary(int *a, int key, int low, int high)
{
    int mid;
    if(low > high)
        return -1;
    mid = (low + high)/2;
    if(a[mid] == key) return mid;
    else if(a[mid] > key)
        return recurbinary(a,key,low,mid -1);
    else
        return recurbinary(a,key,mid + 1,high);
}

//非递归算法
int binary( int *a, int key, int n )
{
    int left = 0, right = n - 1, mid = 0;
    mid = ( left + right ) / 2;
    while( left < right && a[mid] != key )
    {
        if( a[mid] < key ) {
            left = mid + 1;
        } else if( a[mid] > key ) {
            right = mid;
        }
        mid = ( left + right ) / 2;
    }
    if( a[mid] == key )
        return mid;
    return -1;
}
int main()
{
    int a[] = {1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677};
    printf("%d\n",recurbinary(a,45,0,20));
    printf("%d\n",binary(a,3,21));
    return 0;
}

原理:

(1)定义3个变量left, right, mid分别表示有序数组查找部分的起始位、结束位和中间位,若元素总个数为偶数,则中间位表示中间左边的那一位。

(2)判断mid和查找值key的大小关系,若key<mid则在[left,mid-1]范围内查找;若key>mid则在[mid+1,right]范围内查找。

发布了73 篇原创文章 · 获赞 55 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_35756383/article/details/82716091