1. 程式人生 > >C語言易錯基礎知識彙總

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()的使用:

#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]範圍內查詢。