函數與編譯預處理重點
⑴ c語言:預處理是什麼意思就是看不懂這句話的解釋!越具體越好,也可以通俗一點!
第十一章 預處理概述
在前面各章中,已多次使用過以「#」號開頭的預處理命令。如包含命令# include,宏定義命令# define等。在源程序中這些命令都放在函數之外, 而且一般都放在源文件的前面,它們稱為預處理部分。所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預處理是C語言的一個重要功能, 它由預處理程序負責完成。當對一個源文件進行編譯時, 系統將自動引用預處理程序對源程序中的預處理部分作處理, 處理完畢自動進入對源程序的編譯。C語言提供了多種預處理功能,如宏定義、文件包含、 條件編譯等。合理地使用預處理功能編寫的程序便於閱讀、修改、 移植和調試,也有利於模塊化程序設計。本章介紹常用的幾種預處理功能。宏定義
在C語言源程序中允許用一個標識符來表示一個字元串, 稱為「宏」。被定義為「宏」的標識符稱為「宏名」。在編譯預處理時,對程序中所有出現的「宏名」,都用宏定義中的字元串去代換, 這稱為「宏代換」或「宏展開」。宏定義是由源程序中的宏定義命令完成的。 宏代換是由預處理程序自動完成的。在C語言中,「宏」分為有參數和無參數兩種。 下面分別討論這兩種「宏」的定義和調用。 無參宏定義
無參宏的宏名後不帶參數。其定義的一般形式為: #define 標識符 字元串 其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為宏定義命令。 「標識符」為所定義的宏名。「字元串」可以是常數、表達式、格式串等。在前面介紹過的符號常量的定義就是一種無參宏定義。 此外,常對程序中反復使用的表達式進行宏定義。例如: # define M (y*y+3*y) 定義M表達式(y*y+3*y)。在編寫源程序時,所有的(y*y+3*y)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(y*y+3*y)表達式去置換所有的宏名M,然後再進行編譯。
#define M (y*y+3*y)
main(){
int s,y;
printf("input a number: ");
scanf("%d",&y);
s=3*M+4*M+5*M;
printf("s=%d\n",s);
}
上常式序中首先進行宏定義,定義M表達式(y*y+3*y),在s= 3*M+4*M+5* M中作了宏調用。在預處理時經宏展開後該語句變為:s=3*(y*y+3*y)+4(y*y+3*y)+5(y*y+3*y);但要注意的是,在宏定義中表達式(y*y+3*y)兩邊的括弧不能少。否則會發生錯誤。
當作以下定義後: #difine M y*y+3*y在宏展開時將得到下述語句: s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;這相當於; 3y�2+3y+4y�2+3y+5y�2+3y;顯然與原題意要求不符。計算結果當然是錯誤的。 因此在作宏定義時必須十分注意。應保證在宏代換之後不發生錯誤。對於宏定義還要說明以下幾點:1. 宏定義是用宏名來表示一個字元串,在宏展開時又以該字元串取代宏名,這只是一種簡單的代換,字元串中可以含任何字元,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程序時發現。2. 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。3. 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結 束。如要終止其作用域可使用# undef命令,例如: # define PI 3.14159
main()
{
……
}
# undef PIPI的作用域
f1()
....表示PI只在main函數中有效,在f1中無效。
4. 宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換。
#define OK 100
main()
{
printf("OK");
printf("\n");
}
上例中定義宏名OK表示100,但在printf語句中OK被引號括起來,因此不作宏代換。程序的運行結果為:OK這表示把「OK」當字元串處理。5. 宏定義允許嵌套,在宏定義的字元串中可以使用已經定義的宏名。在宏展開時由預處理程序層層代換。例如: #define PI 3.1415926
#define S PI*y*y /* PI是已定義的宏名*/對語句: printf("%f",s);在宏代換後變為: printf("%f",3.1415926*y*y);6. 習慣上宏名用大寫字母表示,以便於與變數區別。但也允許用小寫字母。7. 可用宏定義表示數據類型,使書寫方便。例如: #define STU struct stu在程序中可用STU作變數說明: STU body[5],*p;#define INTEGER int在程序中即可用INTEGER作整型變數說明: INTEGER a,b; 應注意用宏定義表示數據類型和用typedef定義數據說明符的區別。宏定義只是簡單的字元串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換, 而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。請看下面的例子: #define PIN1 int*typedef (int*) PIN2;從形式上看這兩者相似, 但在實際使用中卻不相同。下面用PIN1,PIN2說明變數時就可以看出它們的區別: PIN1 a,b;在宏代換後變成 int *a,b;表示a是指向整型的指針變數,而b是整型變數。然而:PIN2 a,b;表示a,b都是指向整型的指針變數。因為PIN2是一個類型說明符。由這個例子可見,宏定義雖然也可表示數據類型, 但畢竟是作字元
代換。在使用時要分外小心,以避出錯。8. 對「輸出格式」作宏定義,可以減少書寫麻煩。例9.3 中就採用了這種方法。
#define P printf
#define D "%d\n"
#define F "%f\n"
main(){
int a=5, c=8, e=11;
float b=3.8, d=9.7, f=21.08;
P(D F,a,b);
P(D F,c,d);
P(D F,e,f);
}帶參宏定義C語言允許宏帶有參數。在宏定義中的參數稱為形式參數, 在宏調用中的參數稱為實際參數。對帶參數的宏,在調用中,不僅要宏展開, 而且要用實參去代換形參。帶參宏定義的一般形式為: #define 宏名(形參表) 字元串 在字元串中含有各個形參。帶參宏調用的一般形式為: 宏名(實參表);
例如:
#define M(y) y*y+3*y /*宏定義*/
:
k=M(5); /*宏調用*/
: 在宏調用時,用實參5去代替形參y, 經預處理宏展開後的語句
為: k=5*5+3*5
#define MAX(a,b) (a>b)?a:b
main(){
int x,y,max;
printf("input two numbers: ");
scanf("%d%d",&x,&y);
max=MAX(x,y);
printf("max=%d\n",max);
}
上常式序的第一行進行帶參宏定義,用宏名MAX表示條件表達式(a>b)?a:b,形參a,b均出現在條件表達式中。程序第七行max=MAX(x,
y)為宏調用,實參x,y,將代換形參a,b。宏展開後該語句為: max=(x>y)?x:y;用於計算x,y中的大數。對於帶參的宏定義有以下問題需要說明:1. 帶參宏定義中,宏名和形參表之間不能有空格出現。
例如把: #define MAX(a,b) (a>b)?a:b寫為: #define MAX (a,b) (a>b)?a:b 將被認為是無參宏定義,宏名MAX代表字元串 (a,b)(a>b)?a:b。
宏展開時,宏調用語句: max=MAX(x,y);將變為: max=(a,b)(a>b)?a:b(x,y);這顯然是錯誤的。2. 在帶參宏定義中,形式參數不分配內存單元,因此不必作類型定義。而宏調用中的實參有具體的值。要用它們去代換形參,因此必須作類型說明。這是與函數中的情況不同的。在函數中,形參和實參是兩個不同的量,各有自己的作用域,調用時要把實參值賦予形參,進行「值傳遞」。而在帶參宏中,只是符號代換,不存在值傳遞的問題。3. 在宏定義中的形參是標識符,而宏調用中的實參可以是表達式。
#define SQ(y) (y)*(y)
main(){
int a,sq;
printf("input a number: ");
scanf("%d",&a);
sq=SQ(a+1);
printf("sq=%d\n",sq);
}
上例中第一行為宏定義,形參為y。程序第七行宏調用中實參為a+1,是一個表達式,在宏展開時,用a+1代換y,再用(y)*(y) 代換SQ,得到如下語句: sq=(a+1)*(a+1); 這與函數的調用是不同的, 函數調用時要把實參表達式的值求出來再賦予形參。 而宏代換中對實參表達式不作計算直接地照原樣代換。4. 在宏定義中,字元串內的形參通常要用括弧括起來以避免出錯。 在上例中的宏定義中(y)*(y)表達式的y都用括弧括起來,因此結果是正確的。如果去掉括弧,把程序改為以下形式:
#define SQ(y) y*y
main(){
int a,sq;
printf("input a number: ");
scanf("%d",&a);
sq=SQ(a+1);
printf("sq=%d\n",sq);
}
運行結果為:input a number:3
sq=7 同樣輸入3,但結果卻是不一樣的。問題在哪裡呢? 這是由於代換只作符號代換而不作其它處理而造成的。 宏代換後將得到以下語句: sq=a+1*a+1; 由於a為3故sq的值為7。這顯然與題意相違,因此參數兩邊的括弧是不能少的。即使在參數兩邊加括弧還是不夠的,請看下面程序:
#define SQ(y) (y)*(y)
main(){
int a,sq;
printf("input a number: ");
scanf("%d",&a);
sq=160/SQ(a+1);
printf("sq=%d\n",sq);
}
本程序與前例相比,只把宏調用語句改為: sq=160/SQ(a+1); 運行本程序如輸入值仍為3時,希望結果為10。但實際運行的結果如下:input a number:3sq=160為什麼會得這樣的結果呢?分析宏調用語句,在宏代換之後變為: sq=160/(a+1)*(a+1);a為3時,由於「/」和「*」運算符優先順序和結合性相同, 則先作160/(3+1)得40,再作40*(3+1)最後得160。為了得到正確答案應在宏定義中的整個字元串外加括弧, 程序修改如下
#define SQ(y) ((y)*(y))
main(){
int a,sq;
printf("input a number: ");
scanf("%d",&a);
sq=160/SQ(a+1);
printf("sq=%d\n",sq);
}
以上討論說明,對於宏定義不僅應在參數兩側加括弧, 也應在整個字元串外加括弧。5. 帶參的宏和帶參函數很相似,但有本質上的不同,除上面已談到的各點外,把同一表達式用函數處理與用宏處理兩者的結果有可能是不同的。main(){
int i=1;
while(i<=5)
printf("%d\n",SQ(i++));
}
SQ(int y)
{
return((y)*(y));
}#define SQ(y) ((y)*(y))
main(){
int i=1;
while(i<=5)
printf("%d\n",SQ(i++));
}
在上例中函數名為SQ,形參為Y,函數體表達式為((y)*(y))。在例9.6中宏名為SQ,形參也為y,字元串表達式為(y)*(y))。 兩例是相同的。例9.6的函數調用為SQ(i++),例9.7的宏調用為SQ(i++),實參也是相同的。從輸出結果來看,卻大不相同。分析如下:在例9.6中,函數調用是把實參i值傳給形參y後自增1。 然後輸出函數值。因而要循環5次。輸出1~5的平方值。而在例9.7中宏調用時,只作代換。SQ(i++)被代換為((i++)*(i++))。在第一次循環時,由於i等於1,其計算過程為:表達式中前一個i初值為1,然後i自增1變為2,因此表達式中第2個i初值為2,兩相乘的結果也為2,然後i值再自增1,得3。在第二次循環時,i值已有初值為3,因此表達式中前一個i為3,後一個i為4, 乘積為12,然後i再自增1變為5。進入第三次循環,由於i 值已為5,所以這將是最後一次循環。計算表達式的值為5*6等於30。i值再自增1變為6,不再滿足循環條件,停止循環。從以上分析可以看出函數調用和宏調用二者在形式上相似, 在本質上是完全不同的。6. 宏定義也可用來定義多個語句,在宏調用時,把這些語句又代換到源程序內。看下面的例子。
#define SSSV(s1,s2,s3,v) s1=l*w;s2=l*h;s3=w*h;v=w*l*h;
main(){
int l=3,w=4,h=5,sa,sb,sc,vv;
SSSV(sa,sb,sc,vv);
printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);
}
程序第一行為宏定義,用宏名SSSV表示4個賦值語句,4 個形參分別為4個賦值符左部的變數。在宏調用時,把4 個語句展開並用實參代替形參。使計算結果送入實參之中。文件包含文件包含是C預處理程序的另一個重要功能。文件包含命令行的一般形式為: #include"文件名" 在前面我們已多次用此命令包含過庫函數的頭文件。例如:
#include"stdio.h"
#include"math.h"
文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行, 從而把指定的文件和當前的源程序文件連成一個源文件。在程序設計中,文件包含是很有用的。 一個大的程序可以分為多個模塊,由多個程序員分別編程。 有些公用的符號常量或宏定義等可單獨組成一個文件, 在其它文件的開頭用包含命令包含該文件即可使用。這樣,可避免在每個文件開頭都去書寫那些公用量, 從而節省時間,並減少出錯。對文件包含命令還要說明以下幾點:
1. 包含命令中的文件名可以用雙引號括起來,也可以用尖括弧括起來。例如以下寫法都是允許的: #include"stdio.h"#include<math.h> 但是這兩種形式是有區別的:使用尖括弧表示在包含文件目錄中去查找(包含目錄是由用戶在設置環境時設置的), 而不在源文件目錄去查找; 使用雙引號則表示首先在當前的源文件目錄中查找,若未找到才到包含目錄中去查找。 用戶編程時可根據自己文件所在的目錄來選擇某一種命令形式。2. 一個include命令只能指定一個被包含文件, 若有多個文件要包含,則需用多個include命令。3. 文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。條件編譯預處理程序提供了條件編譯的功能。 可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。 這對於程序的移植和調試是很有用的。 條件編譯有三種形式,下面分別介紹:
1. 第一種形式:
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的功能是,如果標識符已被 #define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。如果沒有程序段2(它為空),本格式中的#else可以沒有, 即可以寫為:
#ifdef 標識符
程序段 #endif
#define NUM ok
main(){
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
#ifdef NUM
printf("Number=%d\nScore=%f\n",ps->num,ps->score);
#else
printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
#endif
free(ps);
}
由於在程序的第16行插入了條件編譯預處理命令, 因此要根據NUM是否被定義過來決定編譯那一個printf語句。而在程序的第一行已對NUM作過宏定義,因此應對第一個printf語句作編譯故運行結果是輸出了學號和成績。在程序的第一行宏定義中,定義NUM表示字元串OK,其實也可以為任何字元串,甚至不給出任何字元串,寫為: #define NUM 也具有同樣的意義。 只有取消程序的第一行才會去編譯第二個printf語句。讀者可上機試作。2. 第二種形式:
#ifndef 標識符
程序段1
#else
程序段2
#endif
與第一種形式的區別是將「ifdef」改為「ifndef」。它的功能是,如果標識符未被#define命令定義過則對程序段1進行編譯, 否則對程序段2進行編譯。這與第一種形式的功能正相反。3. 第三種形式:
#if 常量表達式
程序段1
#else
程序段2
#endif
它的功能是,如常量表達式的值為真(非0),則對程序段1 進行編譯,否則對程序段2進行編譯。因此可以使程序在不同條件下,完成不同的功能
#define R 1
main(){
float c,r,s;
printf ("input a number: ");
scanf("%f",&c);
#if R
r=3.14159*c*c;
printf("area of round is: %f\n",r);
#else
s=c*c;
printf("area of square is: %f\n",s);
#endif
}
本例中採用了第三種形式的條件編譯。在程序第一行宏定義中,定義R為1,因此在條件編譯時,常量表達式的值為真, 故計算並輸出圓面積。上面介紹的條件編譯當然也可以用條件語句來實現。 但是用條件語句將會對整個源程序進行編譯,生成的目標代碼程序很長,而採用條件編譯,則根據條件只編譯其中的程序段1或程序段2, 生成的目標程序較短。如果條件選擇的程序段很長, 採用條件編譯的方法是十分必要的。
⑵ 如果能把C語言的要點給我列的在詳細一點就更好了
C語言知識要點——轉給那些還沒把書看完的同志們
來源: 李志遠的日誌
1.C源程序的框架
盡管各個C源程序的功能千變萬化,但框架是不變的,主要有:編譯預處理、主函數()、函數n()等,主函數的位置不一定在最前面,可以在程序的中部或後面,主函數的名字固定為main。
2.C語言源程序的書寫規則:
(1)C源程序是由一個主函數和若干個其它函數組成的。
(2)函數名後必須有小括弧,函數體放在大括弧內。
(3)C程序必須用小寫字母書寫。
(4)每句的末尾加分號。
(5)可以一行多句。
(6)可以一句多行。
(7)可以在程序的任何位置加註釋。
3.語句種類
語句是程序的基本成分,程序的執行就是通過一條條語句的執行而得以實現的,根據表現形式及功能的不同,C語言的基本語句可以分為五大類。
(1)流程式控制制語句
流程式控制制語句的功能是控製程序的走向,程序的流程有三種基本結構:順序結構、分支結構和循環結構,任何復雜的程序都可以由這三種基本結構復合而成。其中後兩種結構要用特定的流程式控制制語句實現。
(2)表達式語句
表達式語句的形式是:表達式;,即表達式後跟一分號";",分號是語句結束符,是一個語句必不可少的成分。表達式和表達式語句的區別在於表達式代表的是一個數值,而表達式語句則代表一種動作。最常見的表達式語句是賦值語句。
(3)函數調用語句
函數調用語句實際上也是一種表達式語句,形式為:在一次函數調用的小括弧後面加上一個分號。
(4)空語句
空語句的形式就是一個分號,它不代表任何動作,常常作為一個意義轉折點使用。
(5)復合語句
復合語句從形式上看是多個語句的組合,但在語法意義上它只相當於一個語句,在任何單一語句存在的地方都可以是復合語句。注意復合語句中最後一個語句末尾的分號不能少。復合語句右大括弧後面沒有分號。
4.運算符
用來表示數據各種操作的符號稱為運算符。運算符實際上代表了一種類型數據的運算規則。不同的運算符具有不同的運算規則,其操作的數據類型必須符合該運算符的要求,運算結果的數據類型也是固定的。
根據參加操作的數據個數多少,可以將C語言的運算符分為單目運算符,雙目運算符和三目運算符(三目運算符只有條件運算符一個)。
根據運算對象和運算結果的數據類型可分為算術運算符、關系運算符、邏輯運算符等。
5.表達式
表達式是由常量、變數、函數,通過運算符連接起來而形成的一個算式。一個常量,一個變數或一個函數都可以看成是一個表達式。
表達式的種類有:
算術表達式、關系表達式、邏輯表達式、賦值表達式、字位表達式、強制類型轉換表達式、逗號表達式(順序表達式)、條件表達式、指針表達式。
6.數據的輸入/輸出
C語言本身沒有輸人/輸出語句,數據的輸入/輸出是通過調用庫函數來實現的。
第二章 數據類型知識點
劃分數據類型的意義是編譯系統對每個不同類型的數據在內存中分配的位元組數不同,不同類型的數據可以按規定參加不同類型的運算。
1.C語言的數據類型
數據類型有:整型、字元型、實型單精度型、雙精度型、構造類型數組類型、結構體類型、共用體類型、枚舉類型、指針類型、空類型,其中整型、實型、字元型是C語言中的基本類型。
2.各種類型數據的定義方法
定義形式:數據類型 變數名1,變數名2,......變數名n;
3.常量與變數
(1)常量——在程序執行期間其值不變的量。它不能被賦值。
(2)變數——在程序運行期間其值可以改變的量。
4.各種類型數據的混合運算
各類數據運算前會自動轉換成同一類型。規律如右圖示:從右向左的箭頭表示必定的轉換,如float型數據運算前化成double型,以提高運算精度,結果也為double型,short或char型數據運算前化成int型,結果也為int型;從下向上的箭頭表示轉換方向是向級別高的靠攏。
5.強制類型變換
當我們需要對數據進行類型變換,而機器又不能自動完成時,就要用強制類型變換,形式為:(數據類型符)(被轉換對象)。
第三章 選擇知識點
C語言中實現選擇結構的控制語句有兩種:條件分支語句if和開關分支語句switch。
1.if語句的三種形式:
(1) if(表達式)語句;
(2) if(表達式)語句1;
else語句2;
(3) if(表達式1)語句1;
else if(表達式2)語句2;
else if(表達式3)語句3;
...
else if(表達式n)語句n;
2.開關分支語句switch
(1)形式
switch(表達式)
{ case e1:語句1;break;
case e2:語句2;break;
case e3:語句3;break;
......
case en:語句n;break;
default :語句n+1;
}
(2)功能
當表達式的值等於e1時,執行語句1;
當表達式的值等於e2時,執行語句2;
......
當表達式的值等於en時,執行語句n;
當表達式的值與常量e1、e2......en誰都不等時,就執行default後的語句
第四章 循環知識點
循環就是在程序執行過程中,反復多次的執行同一段程序。C語言中有三種循環語句。
1.while循環語句
形式為:while(表達式)
{
循環體
};
執行過程是:先計算表達式的值,當表達式的值非0時就執行循環體,之後再判斷表達式的值,且重復以上過程;當表達式的值為0時就結束循環。
2.do-- while循環語句
形式為:do
{
循環體
} while(表達式);
執行過程是:先執行循環體一次,再判斷表達式的值,當表達式的值非0時就再執行循環體,之後再判斷表達式的值,且重復以上過程;當表達式的值為0時就結束循環。
3.for循環語句
形式為:for(表達式1;表達式2;表達式3)
{ 循環體 }
4.三種循環語句的比較
三種循環語句可以完成同一件事,可任選其一。
使用while和do-- while循環時,要提前給循環變數賦初值。而for循環是在表達式1中賦初值的。
while循環和for循環都是先判斷條件後執行循環體,有可能一次也不執行循環體,do-- while循環是先執行循環體,後判斷條件,即循環體至少也得執行一次。for循環不限於計數循環,其循環條件可以是邏輯表達式和字元表達式等。
5.循環嵌套
三種循環控制語句可以互相嵌套,即在一個循環體內部又可以出現另一循環,這種嵌套在理論上來說可以是無限的。注意必須是一個循環完整的套住另一個循環。
6.break語句
break語句只能出現在三種循環語句和switch多分支語句中,其作用是用來中斷這四種語句的執行。當程序執行到break語句時,會跳出break語句所在的循環或switch分支,而直接執行緊跟在它們後面的語句。
7.continue語句
continue語句只能出現在三種循環語句中,當程序執行到continue語句時,其作用是提前結束本次循環,自動跳過循環體中後半部剩餘的語句的執行,而直接回到循環條件判斷。根據判斷的結果決定是否繼續執行下次循環。
8. goto 語句
goto語句是一種非結構化語句,其作用是使程序的執行無條件的轉移到某一處。使用格式為: goto 標號;利用goto語句與if條件語句配合,也可以實現條件循環。C語句允許在任何語句前添加標號,作為跳轉目標,標號的構成是標識符後面加一個":"。
第五章 數組知識點
數組就是同類型的一批數據的集合,用一個變數名存放,區分各元素的辦法是用下標。
1.一維數組
類型說明符數組名\[數組長度\];
(1)數組命名要符合標識符的命名規則。
(2)數組名後的括弧必須是方括弧,不能是圓括弧。
(3)數組長度必須是正整數,可以是個表達式,但不能有變數,C語言不支持動態數組。
(4)數組長度表示數組中元素的個數
(5)數組元素的下標從0開始數,所以最大下標是數組的長度減1。
2.多維數組(以二維為例)
類型說明符數組名\[第一維長度\]\[第二維長度\];
(1)數組命名要符合標識符的命名規則。
(2)數組名後的括弧必須是兩個方括弧,定義時不能寫成inta\[3,4\];。
(3)數組長度必須是整型常量表達式。
(4)第一維長度表示數組行數,第二維長度表示數組列數。
(5)每個數組元素都有兩個下標,第一維表示該元素所在的行,第二維表示該元素所在的列,每一維的下標都從0開始數。
二維數組的初始化:C語言規定只有靜態數組和外部數組才允許在定義時賦初值,賦初值形式如下:
static類型說明符數組名\[第一維長度\]\[第二維長度\]={初值表};
二維數組的引用:二維數組不能整體引用,要引用數組的單個元素,形式為:數組名\[下標\]\[下標\]和普通變數的使用無任何區別。
3.字元數組
C語言中沒有字元串變數,字元串是靠字元數組實現的,所謂字元數組就是元素的數據類型為字元型的數組。
(1)字元數組的定義形式:char數組名\[數組長度\];
因為C語言中的整型數據和字元型數據是相通的,所以也可以這樣定義:int數組名\[數組長度\];
(2)字元數組的初始化:給字元數組的初始化有兩種方式,一種是用字元常量,另一種是用字元串。形式如下:
staticchar數組名\[數組長度\]={字元常量表};
staticchar數組名\[數組長度\]={字元串常量};
4.數組與函數
數組經常作為函數的參數,數組做函數的參數有兩種形式,一是數組元素做函數的參數,一是數組名做函數的參數,當用數組名做函數的實參時傳送的是首地址。
5.常用的字元串處理函數
C語言提供了一些處理字元串的標准函數,用以完成一些常見的操作。對以下幾個函數要掌握其功能和調用形式。
(1)gets(字元數組名)此函數功能是從鍵盤輸入一串字元,回車後送到字元數組中,注意定義數組時數組長度要足夠大。
(2)puts(字元數組名)此函數功能是將字元數組的內容輸出到屏幕上。
(3)strcat(字元數組名1,字元數組名2)此函數功能是將字元數組1中的'\\0'去掉後將字元數組2的內容連接到字元數組1的末尾。
(4)strcpy(字元數組名1,字元數組名2)函數功能是將字元數組2的內容(包括'\\0')拷貝到字元數組1中,字元數組2處也可以是字元串常量。strcpy函數可以實現拷子串。
(5)strcmp(字元數組名1,字元數組名2)函數功能是兩個字元串(ASCII碼)比大小。
(6)strlen(字元數組名)此函數功能是求字元串的長度,注意不包括'\\0'。
(7)strlwr(字元數組名)此函數功能是將字元串中的所有大寫字母都變成小寫。
(8)strupr(字元數組名)此函數功能是將字元串中的所有小寫字母都變成大寫。
第六章 函數知識點
每個C源程序都是由函數組成的,一個主函數和若干個其它函數,C語言程序設計的基礎工作就是函數的具體編寫,C語言中的函數就相當於其它高級語言中的子程序。
1.函數的概念
函數就是一個數據加工廠,從函數外部接收數據,在函數內部加工處理,然後得到一個結果返回給外部的調用者。所以函數就是對語言功能的擴充,對函數的調用就是對功能的調用。
2.標准函數
各種高級語言都定義了一些標准函數,C語言中的標准函數稱為庫函數,是將一些基本的、常用的功能編成了函數,供大家使用方便。使用庫函數時必須把它的頭文件用#i nclude命令包含進來,每個庫函數的功能及對應的頭文件都會在手冊中給出。
3.自定義函數
C 語言也允許用戶自己編寫函數以實現C庫函數中沒有提供的功能,稱作自定義函數。
4.定義函數
C語言規定每個函數都要獨立定義,函數定義不能嵌套。
函數定義的形式:數據類型函數名(形參表)
形參說明語句序列
{ 說明語句序列
可執行語句序列 }
5.函數調用
函數調用的形式是: 函數名(實參表)。當實參表中有多個參數時,要用逗號隔開,若被調函數無參數,調用時小括弧也不能省。函數調用過程是:將實參的值傳給形參,在函數體內進行加工處理,然後由return語句將函數值返回調用處。
5.全局變數和局部變數
局部變數:在函數內部定義的變數稱為局部變數,只在本函數中有效。
全局變數:在函數外部定義的變數稱為全局變數,它的作用范圍是從定義開始到本文件結束。
6.動態存儲與靜態存儲
內存中的用戶數據區分為動態存儲區和靜態存儲區,動態存儲區是指程序運行期間給變數臨時分配存儲單元,變數用完後立即釋放單元的區域,動態存儲區放的是函數的形參、自動變數、函數調用期間的現場保護數據和返回地址。
靜態存儲區是指程序運行期間給變數分配固定的存儲單元,放的是全局變數和局部靜態變數。
一個變數除了它的數據類型以外還有存儲類型,定義一個變數時應該說明這兩種類型。
第七章 預處理知識點
對高級語言編譯連接就是把源程序轉換成機器語言,C語言在進行編譯之前還要預先處理三件事:宏定義命令、文件包含命令和條件編譯命令,統稱為預處理命令,其特點是:
1.所有的預處理命令都放在程序的頭部,以#開頭,且#號後面不留空格。
2.預處理命令不是C的語句,行尾不加分號。
3.預處理命令是在編譯預處理階段完成的,所以它們沒有任何計算、操作等執行功能。
4.預處理命令有所變動後,必須對程序重新進行編譯和連接。
1.宏定義
宏定義命令的作用是給一些常用的對象重新命名,在程序中可以用宏名來引用這些對象,預處理時宏名會被代表的內容替換,此過程稱為宏展開或宏替換。宏定義有兩種形式:
2.文件包含
使用文件包含命令可以將另—個C源程序的全部內容包含進來,其形式為:
#i nclude <文件名>或#i nclude "文件名"
通常可以把經常用到的,帶公用性的一些函數或符號等集合在...起形成一個源文件,然後用此命令將這個源文件包含進來,這樣可以避免在每個新程序中都要重新鍵入這些內容。
3.條件編譯
顧名思義滿足條件時進行編譯,為了解決程序移植問題,C語言提供了條件編譯命令,它能使源程序在不同的編譯環境下生成不同的目標代碼文件。條件編譯命令有3種形式。
第八章 指針知識點
1.什麼是指針和指針變數?
指針就是內存地址,因為通過"地址"可以找到變數,所以內存"地址"形象的稱為指針。
指針變數就是存地址的變數。在C語言中用一個變數存另一個變數的地址,那麼就稱這個變數為指針變數,指針變數的值就是地址。通常指針變數被簡稱為指針。
指針變數是有類型的,即指針值增1表示指向下一個數據,如整型數據在內存中占兩個位元組,它的指針變數增1是增兩個位元組。如實型數據在內存中佔4個位元組,它的指針變數增1是增4個位元組。
2.怎樣定義指針變數?
定義形式為:數據類型*指針變數名1,*指針變數名2......;
3.指針的有關運算
指針為內存地址是整數,可以進行一些算術運算、關系運算、賦值運算、特殊運算等,但要注意運算代表的實際意義。
4.指向數組的指針變數
(1)指向數組元素的指針變數定義形式為:inta\[10\];
int*p=a;
(2)指向一維數組的指針變數
定義形式為:inta\[3\]\[4\];
int(*p)\[4\];
p=a;
(3)指向字元串的指針變數
定義形式為: char*p="字元序列";
C語言中的字元串是以隱含形式的字元數組存放的,定義了指針變數p並不是將整個字元串都存放在p中了,而p中存放的是字元串的首地址。
5.指向函數的指針變數
一個函數在編譯時被分配一個入口地址,這個地址就是函數的指針,可以用一個指針變數指向它。指向函數的指針變數定義形式為:
數據類型(*指針變數名);
6.指針變數做函數的參數
(1)指針作函數的參數可以傳送地址,如數組的首地址,函數的入口地址等。
(2)指針作函數的參數也可以用地址方式傳送數據。
7.返回值是指針的函數
即函數的返回值是內存的地址,利用這種方法可以將一個以上的數據返回給函數的調用者。定義形式如下:
數據類型*函數名(形參表)
8.指針數組
定義形式為:數據類型*數組名\[數組長度\];
數組中的每個元素都是指針類型的數據,這種數組被稱為指針數組。
9.指向指針的指針
定義形式為:數據類型**指針變數名;
指向指針數據的指針變數稱為指向指針的指針。
10.main函數的形參
main函數可以帶兩個形參,如:
main(argc,argv)
intargc;
char *argv\[\];
{
......
}
11.指向結構體的指針變數
結構體變數的指針就是該變數所佔據的內存段的首地址。指向結構體的指針變數定義形式為:struct結構體類型名*指針變數名;
12.指向共用體的指針變數
共用體變數的指針就是該變數所佔據的內存段的首地址。指向共用體的指針變數定義形式為:union共用體類型名*指針變數名;
替換了的字元時(這里為正中間的字元"4"),原來的字元己不復存在。
第九章 結構體與共用體知識點
結構體類型是C語言的一種構造數據類型,它是多個相關的不同類型數據的集合,相當於其它高級語言中的記錄。
1.結構體類型定義
結構體類型的形式為:
struct結構體類型名
{ 數據類型成員名1;
...
數據類型成員名n;
}
2.結構體變數的定義
結構體變數有三種定義形式:
(1)先定義結構體類型,後定義結構體變數。
(2)定義結構體類型的同時定義結構體變數。
(3)不定義結構體類型名,直接定義結構體變數。
3.結構體變數的引用
(1)結構體變數的初始化:許多C版本規定對外部或靜態存儲類型的結構體變數可以進行初始化,而對局部的結構體變數則不可以,新標准C無此限制,允許在定義時對自動變數初始化。
(2)結構體成員的引用:由於C語言一般不允許對結構體變數的整體引用,所以對結構體的引用只能是對分量的引用,結構體變數中的任一分量可以表示為:結構體變數名·成員名
4.結構體與數組
C語言中數組的成員可以是結構體變數,結構體變數的成員也可以是數組。
結構體數組有三種定義形式:
(1)先定義結構體類型,後定義結構體數組。
(2)定義結構體類型的同時定義結構體數組。
(3)不定義結構體類型名,直接定義結構體變數。
5.結構體與指針
一方面結構體變數中的成員可以是指針變數,另一方面也可以定義指向結構體的指針變數,指向結構體的指針變數的值是某一結構體變數在內存中的首地址。
結構體指針的定義形式:struct結構體類型名*結構體指針變數名。
由結構體指針引用結構體成員的方法
6.用指針處理鏈表
結構體的成員可以是指針類型,並且這個指針類型就是本結構體類型的,這樣可以構造出一種動態數據結構—成為鏈表。所謂動態數據就是指在編譯時不能確定數據量的多少,而是在程序執行時才確定的數據,動態數據可以比較方便的進行數據插人或刪除等操作。
7.結構體與函數
結構體變數的成員可以作函數的參數、指向結構體變數的指針也可以作函數的參數。雖然結構體變數名也可以作為函數的參數,將整個結構體變數進行傳遞,但一般不這樣做,因為如果結構體的成員很多,或者有些成員是數組,則程序運行期間,將全部成員一個一個的傳遞,既浪費時間,又浪費空間,開銷太大。
8.結構體與共用體
結構體變數中的成員可以是共用體,共用體變數中的成員可以是結構體。
共用體
為了節省存儲空間,C語言允許將幾種不同類型的數據存放在同一段內存單元,它們共用一個起始地址,稱做共用體。
1.共用體類型定義
union共用體類型名
{ 數據類型成員名1;
...
數據類型成員名n;
}
2.共用體變數定義
(1)先定義類型,後定義變數。
(2)定義類型的同時定義變數。
(3)不定義類型名,直接定義變數。
3.共用體變數的引用
(1)共用體變數不能整體引用,只能引用其成員,形式為:共用體變數名·成員名
(2)共用體變數的成員不能初始化,因為它只能放一個數據。
(3)共用體變數存放的數據是最後放入的數據。
(4)共用體變數的長度是最大的成員的長度。
(5)可以引用共用體變數的地址、各個成員的地址,它們都是同一個地址。
(6)共用體變數不能當函數的參數或函數的返回值,但可以用指向共用體變數的指針作函數的參數。
(7)共用體變數的成員可以是數組,數組的成員也可以是共用體變數。
第十章 位運算知識點
位運算就是按二進制位進行操作的運算,運算的對象只能是整型或字元型,不能是實型。不同長度的變數進行位運算,系統會自動右對齊,而左端的不齊部分,對於無符號數左端補滿0,對於有符號數則:正數左端補滿0,負數左端補滿1。
第十一章 文件知識點
操作系統是以文件為單位對數據進行管理的,任何一種計算機高級語言都要有和磁碟文件打交道的能力,否則該語言的功能充其量是算一算、顯示顯示而已。在C語言中沒有單獨的文件操作語句,所有對文件的操作都是通過庫函數來完成的,所以本章的重點是學會使用有關文件操作的庫函數。
1.文件的基本概念
2.文件類型指針
3.文件的操作
⑶ C語言編譯預處理的問題
編譯之前,預先處理一下
把宏啊那些先轉換成實際代碼
#define #ifdef 等等
⑷ C語言編程問題(函數與編譯預處理)
#include <stdio.h>
void input(float a[10]);
void output(float b[10]);
void input(float a[10])
{
int i,j;
float t;
for(j=0;j<9;j++)
for(i=0;i<9-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
}
void output(float b[10])
{int i;
for(i=0;i<10;i++)
printf("%f ",b[i]);
}
void main()
{int i;
float c[10];
printf("請輸入10個實型數:\n");
for(i=0;i<10;i++)
scanf("%f",&c[i]);
input(c);
printf("\n");
output(c);}
經過本人測試,絕對正確
⑸ c語言問題 函數與編譯預處理
#include<stdio.h>
intk;
main()
{
intfun(intk);//如果函數定義在使用位置之後要提前聲明函數
k=3;
k=fun(k);//將k初始值傳遞過去再將返回來的函數值重新賦值給k
printf("k=%d ",k);
}
intfun(intk)
{
k=k*k;
returnk;//要返回計算得出的k值
}
建議:為了方便閱讀,建議更改一下
#include<stdio.h>
intk;
main()
{
intn;
intfun(intk0);//如果函數定義在使用位置之後要提前聲明函數,而且函數要有返回值類型
k=3;
n=fun(k);//用n接收返回來的函數值
printf("k=%d ",n);
}
intfun(intk0)
{
intk1;
k1=k0*k0;
returnk1;//要返回計算得出的k值
}
補充:函數定義格式: 返回值類型 函數名(形參);形參可要可不要,形參類型個數和函數返回值類型視情況而定
⑹ 9月份全國計算機等級考試二級c語言 備考計劃 重點相關注意事項
公共基礎知識
基本要求
1.掌握演算法的基本概念。
2.掌握基本數據結構及其操作。
3.掌握基本排序和查找演算法。
4.掌握逐步求精的結構化程序設計方法。
5.掌握軟體工程的基本方法,具有初步應用相關技術進行軟體開發的能力。
6.掌握資料庫的基本知識,了解關系資料庫的設計。
考試內容
一、基本數據結構與演算法
1.演算法的基本概念;演算法復雜度的概念和意義(時間復雜度與空間復雜度)。
2.數據結構的定義;數據的邏輯結構與存儲結構;數據結構的圖形表示;線性結構與非線性結構的概念。
3.線性表的定義;線性表的順序存儲結構及其插入與刪除運算。
4.棧和隊列的定義;棧和隊列的順序存儲結構及其基本運算。
5.線性單鏈表、雙向鏈表與循環鏈表的結構及其基本運算。
6.樹的基本概念;二叉樹的定義及其存儲結構;二叉樹的前序、中序和後序遍歷。
7.順序查找與二分法查找演算法;基本排序演算法(交換類排序,選擇類排序,插入類排序)。
二、程序設計基礎
1.程序設計方法與風格
2.結構化程序設計。
3.面向對象的程序設計方法,對象,方法,屬性及繼承與多態性。
三、軟體工程基礎
1.軟體工程基本概念,軟體生命周期概念,軟體工具與軟體開發環境。
2.結構化分析方法,數據流圖,數據字典,軟體需求規格說明書。
3.結構化設計方法,總體設計與詳細設計。
4.軟體測試的方法,白盒測試與黑盒測試,測試用例設計,軟體測試的實施,單元測試、集成測試和系統測試。
5.程序的調試,靜態調試與動態調試。
四、資料庫設計基礎
1.資料庫的基本概念:資料庫,資料庫管理系統,資料庫系統。
2.數據模型,實體聯系模型及E―R圖,從E―R圖導出關系數據模型。
3.關系代數運算,包括集合運算及選擇、投影、連接運算,資料庫規范化理論。
4.資料庫設計方法和步驟:需求分析、概念設計、邏輯設計和物理設計的相關策略。
考試方式
1.公共基礎知識的考試方式為筆試,與C語言程序設計(C++語言程序設計、Java語言程序設計、Visual Basic語言程序設計、Visual FoxPro資料庫程序設計或Access資料庫程序設計)的筆試部分合為一張試卷,公共基礎知識部分佔全卷的30分。
2.公共基礎知識有l0道選擇題和5道填空題。
C語言程序設計
基本要求
1.熟悉TURBO C集成環境。
2.熟練掌握結構化程序設計的方法,具有良好的程序設計風格。
3.掌握程序設計中簡單的數據結構和演算法。
4.TURBO C的集成環境下,能夠編寫簡單的C程序,並具有基本的糾錯和調試程序的能力。
考試內容
一、C語言的結構
1.程序的構成,MAIN函數和其他函數。
2.頭文件,數據說明,函數的開始和結束標志。
3.源程序的書寫格式。
4.C語言的風格。
二、數據類型及其運算
1.C的數據類型(基本類型,構造類型,指針類型,空類型)及其定義方法。
2.C運算符的種類、運算優先順序和結合性。
3.不同類型數據間的轉換與運算。
4.C表達式類型(賦值表達式,算術表達式,關系表達式,邏輯表達式,條件表達式,逗號表達式)和求值規則。
三、基本語句
1.表達式語句,空語句,復合語句。
2.數據的輸入與輸出,輸入輸出函數的調用。
3.復合語句。
4.GOTO語句和語句標號的使用。
四、選擇結構程序設計
1.用IF語句實現選擇結構。
2.用SWITCH語句實現多分支選擇結構。
3.選擇結構的嵌套。
五、循環結構程序設計
1.FOR循環結構。
2.WHILE和DO WHILE循環結構。
3.CONTINUE語句和BREAK語句。
4.循環的嵌套。
六、數組的定義和引用
1.一維數組和多維數組的定義、初始化和引用
2.字元串與字元數組。
七、函數
1.庫函數的正確調用。
2.函數的定義方法。
3.函數的類型和返回值。
4.形式參數與實在參數,參數值的傳遞。
5.函數的正確調用,嵌套調用,遞歸調用。
6.局部變數和全局變數。
7.變數的存儲類別(自動,靜態,寄存器,外部),變數的作用域和生存期。
8.內部函數與外部函數。
八、編譯預處理
1.宏定義:不帶參數的宏定義;帶參數的宏定義。
2.「文件包含」處理。
九、指針
1.指針與指針變數的概念,指針與地址運算符。
2.變數、數組、字元串、函數、結構體的指針以及指向變數、數組、字元串、函數、結構體的指針變數。通過指針引用以上各類型數據。
3.用指針作函數參數。
4.返回指針值的指針函數。
5.指針數組,指向指針的指針,MAIN函數的命令行參數。
十、結構體(即「結構」)與共用體(即「聯合」)
1.結構體和共用體類型數據的定義方法和引用方法。
2.用指針和結構體構成鏈表,單向鏈表的建立、輸出、刪除與插入。
十一、位運算
1.位運算符的含義及使用。
2.簡單的位運算。
十二、文件操作
只要求緩沖文件系統(即高級磁碟I/O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)不要求。
1.文件類型指針(FILE類型指針)。
2.文件的打開與關閉(FOPEN,FCLOSE)。
3.文件的讀寫(FPUTC,FGETC,FPUTS,FGETS,FREAD,FWRITE,FPRINTF,FSCANF函數),文件的定位(REWIND,FSEEK函數)。
考試方式
1.筆試:120分鍾,滿分100分,其中含公共基礎知識部分的30分。
2.上機:60分鍾,滿分100分。
上機操作包括:
(1)填空。
(2)改錯。
(3)編程。
⑺ C語言數組和函數與編譯預處理的有關問題
1.
long fac(int n)
{
long result=1,i;
for(i=1;i<=n;i++)
result*=n;
return result;
}
2.
是不是求m的n次方啊,如果是的話,那麼就是下面的代碼
int f(int m,int n)
{
if(n=0) return 1;
return m*f(m,n-1);
}
⑻ 關於C語言函數與編譯預處理的編程
1.
long fac(int n)
{
long result=1,i;
for(i=1;i<=n;i++)
result*=n;
return result;
}
2.
是不是求m的n次方啊,如果是的話,那麼就是下面的代碼
int f(int m,int n)
{
if(n=0) return 1;
return m*f(m,n-1);
}
⑼ 現在的無紙化計算機二級c語言的考試題型分哪幾類,重點是什麼
全國計算機等級考試二級C語言程序設計考試大綱
基本要求
1. 熟悉Visual C++6. 0集成開發環境。
2. 掌握結構化程序設計的方法,具有良好的程序設計風格。
3. 掌握程序設計中簡單的數據結構和演算法並能閱讀簡單的程序。
4. 在Visual C++6. 0集成環境下,能夠編寫簡單的C程序,並具有基本的糾錯和調試程序的能力。
考試內容
一、C語言程序的結構
1. 程序的構成,main函數和其他函數。
2. 頭文件,數據說明,函數的開始和結束標志以及程序中的注釋。
3. 源程序的書寫格式。
4. C語言的風格。
二、數據類型及其運算
1. C的數據類型(基本類型,構造類型,指針類型,無值類型)及其定義方法。
2. C運算符的種類、運算優先順序和結合性。
3. 不同類型數據間的轉換與運算。
4. C表達式類型(賦值表達式,算術表達式,關系表達式,邏輯表達式,條件表達式,逗號表達式)和求值規則。
三、基本語句
1. 表達式語句,空語句,復合語句。
2. 輸入輸出函數的調用,正確輸入數據並正確設計輸出格式。
四、選擇結構程序設計
1. 用if 語句實現選擇結構。
2. 用switch語句實現多分支選擇結構。
3. 選擇結構的嵌套。
五、循環結構程序設計
1. for循環結構。
2. while和do-while循環結構。
3. continue語句和break語句。
4. 循環的嵌套。
六、數組的定義和引用
1. 一維數組和二維數組的定義、初始化和數組元素的引用。
2. 字元串與字元數組。
七、函數
1. 庫函數的正確調用。
2. 函數的定義方法。
3. 函數的類型和返回值。
4. 形式參數與實在參數,參數值的傳遞。
5. 函數的正確調用,嵌套調用,遞歸調用。
6. 局部變數和全局變數。
7. 變數的存儲類別(自動,靜態,寄存器,外部),變數的作用域和生存期。
八、編譯預處理
1. 宏定義和調用(不帶參數的宏,帶參數的宏)。
2. 「文件包含冶處理。
九、指針
1. 地址與指針變數的概念,地址運算符與間址運算符。
2. 一維、二維數組和字元串的地址以及指向變數、數組、字元串、函數、結構體的指針變數的定義。通過指針引用以上各類型數據。
3. 用指針作函數參數。
4. 返回地址值的函數。
5. 指針數組,指向指針的指針。
十、結構體(即「結構冶)與共同體(即「聯合冶)
1. 用typedef 說明一個新類型。
2. 結構體和共用體類型數據的定義和成員的引用。
3. 通過結構體構成鏈表,單向鏈表的建立,結點數據的輸出、刪除與插入。
十一、位運算
1. 位運算符的含義和使用。
2. 簡單的位運算。
十二、文件操作
只要求緩沖文件系統(即高級磁碟I/ O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)不要求。
1. 文件類型指針(FILE類型指針)。
2. 文件的打開與關閉(fopen,fclose)。
3. 文件的讀寫(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf 函數的應用),文件的定位(rewind,fseek函數的應用)。
考試方式
上機考試,考試時長120分鍾,滿分100分。
題型及分值
單項選擇題40分(含公共基礎知識部分10分)、操作題60分(包括填空題、改錯題及編程題)。
考試環境
Visual C++6. 0。
⑽ 計算機二級C語言公共基礎知識復習重點是什麼
計算機二級C語言考試的流程:
1. 筆試:90分鍾,滿分100分,其中含公共基礎知識部分的30分。
2. 上機操作:90分鍾,滿分100分。
上機操作包括:
(1) 基本操作。
(2) 簡單應用。
(3) 綜合應用。計算機二級C語言考試內容 :
一、C語言程序的結構
1.程序的構成,main函數和其他函數。
2.頭文件,數據說明,函數的開始和結束標志以及程序中的注釋。
3.源程序的書寫格式。
4.C語言的風格。
二、數據類型及其運算
1.C的數據類型(基本類型,構造類型,指針類型,無值類型)及其定義方法。
2.C運算符的種類、運算優先順序和結合性。
3.不同類型數據間的轉換與運算。
4.C表達式類型(賦值表達式,算術表達式,關系表達式,邏輯表達式,條件表達式,逗號表達式)和求值規則。
三、基本語句
1.表達式語句,空語句,復合語句。
2.輸入輸出函數的調用,正確輸入數據並正確設計輸出格式。
四、選擇結構程序設計
1.用if語句實現選擇結構。
2.用switch語句實現多分支選擇結構。
3.選擇結構的嵌套。
五、循環結構程序設計
1.for循環結構。
2.while和do-while循環結構。
3.continue語句break語句。
4.循環的嵌套。
六、數組的定義和引用
1.一維數組和二維數組的定義、初始化和數組元素的引用。
2.字元串與字元數組。
七、函數
1.庫函數的正確調用。
2.函數的定義方法。
3.函數的類型和返回值。
4.形式參數與實在參數,參數值的傳遞。
5.函數的正確調用,嵌套調用,遞歸調用。
6.局部變數和全局變數。
7.變數的存儲類別(自動,靜態,寄存器,外部),變數的作用域和生存期。
八、編譯預處理
1.宏定義和調用(不帶參數的宏,帶參數的宏)。
2.「文件包含」處理。
九、指針
1.地址與指針變數的概念,地址運算符與間址運算符。
2.一維。二維數組和字元串的地址以及指向變數、數組、字元串、函數、結構體的指針變數的定義。通過指針引用以上各類型數據。
3.用指針作函數參數。
4.返回地址值的函數。
5.指針數組,指向指針的指針。
十、結構體(即「結構」)與共同體(即:「聯合」)
1.用typedef說明一個新類型。
2.結構體和共用體類型數據的定義和成員的引用。
3.通過結構體構成鏈表,單向鏈表的建立,結點數據的輸出、刪除與插入。
十一、位運算
1.位運算符的含義和使用。
2.簡單的位運算。
十二、文件操作
只要求緩沖文件系統(即高級磁碟I/O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)不要求。
1.文件類型指針(FILE類型指針)。
2.文件的打開與關閉(fopen,fclose)。
3.文件的讀寫(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf函數的應用),文件的定位(rewind,fseek函數的應用)。