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