1. c語言學習筆記:幾種循環方式
三種:1.while;2.do...while;3.for。
2. 求大神整理c語言指令符號及用法大全。
編譯指令
編譯指令
說明
#include
包含另一個文件
#define
定義一個宏(macro)或是常量
#undef
取消一個宏常量的定義
#asm和#endasm
在程序中加入匯編語言的程序
#ifdef、#ifndef、#else、#endif
用於條件式的編譯
註解://—單行註解;
基本數據類型 (int,float,double,char,void)
數據類型
類型說明
長度(位)
數據長度
bit
位
1
0,1
char
字元
8
—128~127
unsigned char
無符號字元
8
0~255
signed char
有符號字元
8
—128~127
int
整型
16
—32768~32767
short int
短整型
16
—32768~32767
unsigned int
無符號整型
16
0~65535
signed int
有符號整型
16
—32768~32767
long int
長整型
32
—2147483648~2147483647
unsigned long int
無符號長整型
32
0~4294967295
signed long int
有符號長整形
32
—2147483648~2147483647
float
浮點數(實數)
32
0.175e-38~0.402e38
double
雙精度浮點
32
0.175e-38~0.402e38
void
空
0
沒任何數據
用戶自定義數據類型格式
typedef struct{
數據類型 變數序列1;
數據類型 變數序列1;
...
}自定義數據類型的名稱;
保留字
_at_,alien,bdata,break,bit,case,char,code,compact,const,continue,data,
default,do,double,far,else,enum,extern,float,for,goto,if,funcused,idata,int,
inline,interrupt,large,long,pdata,_priority_,reentrant,return,sbit,sfr,sfr16,
short,sigend,sizeof,small,static,struct,switchc_task_,typedef,using,union,
unsigned,void,volatile,while,xdata
常量表示法
常數
規則
範例
十進制
一般十進制格式
1234567890
二進制
開頭加上0b
0b00001110
八進制
開頭加上O
O0123
十六進制
開頭加上0x
0xFF45
無符號整數常量
結尾加上U
30000U
長整數常量
結尾加上L
299L
無符號長整數常量
結尾加上UL
327800UL
浮點數的常量
結尾加上F
4.234F
字元常量
以單引號括起來
『a』
字元串常量
以雙引號括起來
「hello」
-----------------------------------------------------運算符-----------------------------------------------------
算術運算
運算符
說明
範例
執行結果
+
加
c=a+b;
c 等於10
—
減
d=a—b;
d 等於6
*
乘
e=a*b;
e 等於16
/
除
f=a/b;
f 等於4
%
取余數
g=a%b;
g 等於0
++
加1
c++;相當於c=c+1;
c 等於11
——
減1
d——;相當於d=d—1;
d 等於5
=
等於
a=8;
設置a等於8
+=
先相加在等於
e+=5;相當於e=e+5;
e 等於21
—=
先相減在等於
f—=5;相當於f=f—5;
f 等於—1
*=
先相乘在等於
b*=5;相當於b=b*5;
b 等於0
/=
先相除在等於
a/=5;相當於a=a/5;
a 等於1
%=
先取余數在等於
a%=5;相當於a=a%5;
a 等於3
※假設a等於8,b等於2
比較運算
運算符
說明
範例
執行結果
==
等於
a==5
F
!=
不等於
a!=5
T
<<o:p>
小於
a<5
F
>
大於
a>5
T
<=
小於等於
a<=5
F
>=
大於等於
a>=5
T
※比較運算結果是個布爾值既TRUE(真值)或FALSE(假值)。假設a等於8
邏輯運算
運算符
說明
範例
執行結果
&&
AND
(a>5)&&(a<10)
T
||
OR
(a<5)||(a>10)
F
!
NOT
!(a>10)
T
※邏輯運算結果是個布爾值既TRUE(真值)或FALSE(假值)。假設a等於8
位邏輯運算
運算符
說明
範例
執行結果
&
AND
a&0x01
a等於1
|
OR
a|0x80
a等於0x85
~
NOT
~a
a等於0xFA
^
XOR
a^0xFF
a等於0xFA
<<
左移
a<<1
a等於0x0A
>>
右移
a>>1
a等於0x0A
※假設a等於5
----------------------------------------------------控制命令---------------------------------------------------
if語句
if(條件) 語句1;
else 語句2;
例:if(d==4) d=0; //如果d等於4就設置d等於0
else d++; //否則就將d加1
if(ticks==0) { //如果ticks等於0
ticks=1000; //ticks 設置成1000
counter[0]++; //counter[0]加1
}
嵌套if語句
例:if(counter[0]==10) {
counter[1]++;
counter[0]=0;
if(counter[1]==10) {
counter[2]++;
counter[1]=0;
}
}
switch語句
switch (變數) {
case 常量1:語句1; break;
case 常量2:語句2; break;
case 常量3:語句3; break;
......
default ; 語句n;
}
for循環
for (初值,條件,變化值) 語句;
例:for(i=0;i<10;i++) x=x+i;
for(i=1;i<10,i++)
for(j=1;j<10,j++)
printf(「%d %d」,i,j);
無窮循環:
for( ; ; );
while循環
while (條件) 語句;
例:while (ch!=!』A』) ch=getche();
無窮循環:
while(1);
do/while循環
do {
語句;
...
} while(條件);
例:do {
ch=getche();
} while (ch!=」A」);
goto語句
loop1:
x++;
if(x<100) goto loop1;
----------------------------------------------------指針和函數------------------------------------------------
指針的定義
數據類型 *指針變數的名字;
例: char *p;
int *x;
指針與數組
例: char filename[80];
char *p;
p=filename; //指針p存放filename的開始地址
int x[5]={1,2,3,4,5};
int *p,sum,i;
p=x; //指針p存放數組x的開始地址
for(i=0;i<5;i++)
sum=sum+p[i]; //p[i]相當於x[i]
指針的運算
1.針變數前面加上*號就是取得指針所指向位置的內容。
例:int x[5]={1,2,3,4,5};
int *p;
p=x; //指針p存放數組x的開始地址
*p=10; //相當於設置x[0]等於10
2.變數前面加上&符號,可以取得一個變數的位置。
例:int x,y;
int *p;
p=&x; //指針p存放x的地址,相當於p是指向x 的指針
*p=1; //相當於設置x等於1
3.&符號也可以加在數組的前面
例:int x[5];
int *p;
p=&x[2]; //指針p存放x[2]的地址,相當於p是指向x[2]的指針
*p=50; //相當於設置x[2]等於50
函數
函數類型 函數名稱(參數序列);
參數說明
{
函數的主體
}
例:void delay (void) { //不返回任何數據的函數
unsigned char i,j; //沒有任何參數的函數
for(i=0,i<255,i++)
for(j=0,j<255,j++);
}
main()
{
...
delay(); //調用函數
}
例:unsigned char sum(unsigned chat a,unsigned chat b)
{
unsigned chat x;
check_GLCD_busyflag(); //函數中可以調用另一個函數
x=a+b;
return x; //return會返回x的數據
}
中斷服務函數
void 中斷服務程序的名稱(void) interrupt 中斷號碼using 寄存器組號碼
{
中斷服務子程序主體
}
中斷號碼
#define IE0_VECTOR 0 //0x03
#define TF0_VECTOR 1 //0x0B
#define IE1_VECTOR 2 //0x13
#define TF1_VECTOR 3 //0x1B
#define SIO_VECTOR 4 //0x23
對於S51有定時器2
#define TF2_VECTOR 5 //0x2B
例:static void xint0_isr(void) interrupt IE0_VECTOR(或0) using 1
{
unsigned char i,j=0xFF;
for(i=0,i<16,i++)
{
j++;
P1=j; //將數值輸出到P1口
delay_4isr();
}
}
-----------------------------------------------------匯編語言--------------------------------------------------
在C中加入匯編語言
例:void delay100us()
{
#pragma asm
mov r7,#1
more: mov r3,#48
djnz r3,$
djnz r7,more
#pragma endasm
}
----------------------------------------------------宏(macro)----------------------------------------------
宏的定義
%*define (macro名稱) (macro的指令)
例:%*define (write_1) (
setb DI
serb SK
clr SK
)
#define 宏的名稱 宏的指令
例:#define uchar unsigned char
C語言中的符號總結
運算符的種類C語言的運算符可分為以下幾類;
1. 算術運算符
用於各類數值運算,包括加減乘除求余自增自減共七種運算
{ ( + ) ,( - ),(* ) ,( / ) ,( % ),( ++ ),(-- )}。
2. 關系運算符
用於比較運算,包括大於(>),小於(<</span>),等於(==),大於等於(>=),
小於等於(<=),不等於(!=)共六種。
3.邏輯運算符
用於邏輯運算,包括與(&&)或(||)非(!)三種.
4.位操作運算符
參與運算的量,按二進制位進行運算,包括:
位與(&),位或(|),位非(~),為異或(^),左移(<<),右移(>>)共六種。
5.賦值運算符
用於賦值運算,分為:
簡單賦值(=)
復合算術賦值(+=,-=,*=,/=,%=)
復合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
6.條件運算符
這是一個三目運算符,用於條件求值(?:)。
7.逗號運算符
用於把若干表達式組合成一個表達式(,)。
8.指針運算符
用於取內容(*)和取地址(&)兩種運算。
9.求位元組數運算符
用於計算數據類型所佔用的位元組數(sizeof)。
10.特殊運算符
有括弧(),下標[],成員(→, .)
1.C的數據類型
基本類型,構造類型,指針類型,空類型
2.基本類型的分類及特點
類型說明符 位元組 數值范圍
字元型char 1 C字元集
基本整型int 2 -32768~32767
短整型short int 2 -32768~32767
長整型 long int 4 -214783648~214783647
無符號型 unsigned 2 0~65535
無符號長整型 unsigned long 4 0~4294967295
單精度實型 float 4 3/4E-38~3/4E+38
雙精度實型 double 8 1/7E-308~1/7E+308
3.常量後綴
L或l 長整型
U或u 無符號數
F或f 浮點數
4.常量類型
整數,長整數,無符號數,浮點數,字元,字元串,符號常數,轉義字元。
5.數據類型轉換
a自動轉換
在不同類型數據的混合運算中,由系統自動實現轉換, 由少位元組類型向多位元組類型轉換。 不同類型的量相互賦值時也由系統自動進行轉換,把賦值號右邊的類型轉換為左邊的類型。
b強制轉換
由強制轉換運算符完成轉換。
6.運算符優先順序和結合性
一般而言,單目運算符優先順序較高,賦值運算符優先順序低。 算術運算符優先順序較高,關系和邏輯運算符優先順序較低。 多數運算符具有左結合性,單目運算符、三目運算符、 賦值
7.表達式
表達式是由運算符連接常量、變數、函數所組成的式子。 每個表達式都有一個值和類型。 表達式求值按運算符的優先順序和結合性所規定的順序進行。
表示輸出類型的格式字元 格式字元意義
d 以十進制形式輸出帶符號整數(正數不輸出符號)
o 以八進制形式輸出無符號整數(不輸出前綴O)
x 以十六進制形式輸出無符號整數(不輸出前綴OX)
u 以十進制形式輸出無符號整數
f 以小數形式輸出單、雙精度實數
e 以指數形式輸出單、雙精度實數
g 以%f%e中較短的輸出寬度輸出單、雙精度實數
c 輸出單個字元
s 輸出字元串
標志字元為-、+、#、空格四種,其意義下表所示:
標志格式字元 標 志 意 義
- 結果左對齊,右邊填空格
+ 輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
# 對c,s,d,u類無影響;對o類, 在輸出時加前
綴o 對x類,在輸出時加前綴0x;對e,g,f 類當結果有小數時才給出小數點
格式字元串
格式字元串的一般形式為: %[*][輸入數據寬度][長度]類型 其中有方括弧[]的項為任選項。各項的意義如下:
1.類型
表示輸入數據的類型,其格式符和意義下表所示。
格式 字元意義
d 輸入十進制整數
o 輸入八進制整數
x 輸入十六進制整數
u 輸入無符號十進制整數
f或e 輸入實型數(用小數形式或指數形式)
c 輸入單個字元
s 輸入字元串
轉義字元
轉義字元是一種特殊的字元常量。轉義字元以反斜線」\」開頭,後跟一個或幾個字元。轉義字元具有特定的含義,不同於字元原有的意義,故稱「轉義」字元。例如,在前面各例題printf函數的格式串中用到的「\n」就是一個轉義字元,其意義是「回車換行」。轉義字元主要用來表示那些用一般字元不便於表示的控制代碼。
常用的轉義字元及其含義
轉義字元 轉義字元的意義
\n 回車換行
\t 橫向跳到下一製表位置
\v 豎向跳格
\b 退格
\r 回車
\f 走紙換頁
\\ 反斜線符」\」
\』 單引號符
\a 鳴鈴
\ddd 1~3位八進制數所代表的字元
\xhh 1~2位十六進制數所代表的字元
廣義地講,C語言字元集中的任何一個字元均可用轉義字元來表示。表2.2中的\ddd和\xhh正是為此而提出的。ddd和hh分別為八進制和十六進制的ASCII代碼。如\101表示字?quot;A」 ,\102表示字母」B」,\134表示反斜線,\XOA表示換行等。轉義字元的使用
在C語言中,對變數的存儲類型說明有以下四種:
auto 自動變數
register 寄存器變數
extern 外部變數
static 靜態變數
自動變數和寄存器變數屬於動態存儲方式, 外部變數和靜態變數屬於靜態存儲方式。在介紹了變數的存儲類型之後, 可以知道對一個變數的說明不僅應說明其數據類型,還應說明其存儲類型。 因此變數說明的完整形式應為: 存儲類型說明符 數據類型說明符 變數名,變數名…; 例如:
static int a,b; 說明a,b為靜態類型變數
auto char c1,c2; 說明c1,c2為自動字元變數
static int a[5]={1,2,3,4,5}; 說明a為靜整型數組
extern int x,y; 說明x,y為外部整型變數
與指針有關的各種說明和意義見下表。
int *p; p為指向整型量的指針變數
int *p[n]; p為指針數組,由n個指向整型量的指針元素組成。
int (*p)[n]; p為指向整型二維數組的指針變數,二維數組的列數為n
int *p() p為返回指針值的函數,該指針指向整型量
int (*p)() p為指向函數的指針,該函數返回整型量
int **p p為一個指向另一指針的指針變數,該指針指向一個整型量。
指針變數的賦值
p可以有以下兩種方式:
(1)指針變數初始化的方法 int a;
int *p=&a;
(2)賦值語句的方法 int a;
int *p;
p=&a;
(1)取地址運算符&
(2)取內容運算符*
3. 【C語言筆記】<二十一>內部全局變數和外部全局變數
1.外部全局變數, 默認情況下所有的全局變數都是外部全局變數
什麼事外部全局變數? 可以被其它文件訪問的全局變數我們稱之為外部全局變數
2.內部全局變數, 只要給全局變數加上static關鍵字就是內部全局變數
什麼是內部全局變數? 只能被當前文件訪問的全局變數我們稱之為內部全局變數
可以定義同名的外部全局變數
多個同名的外部全局變數指向同一塊存儲空間
也可以定義多個同名的內部全局變數
多個同名的全局變數如果不在同一個文件中, 那麼指向不同的存儲空間
為了提高數據的安全性, 不讓別人在其它文件中修改我們的全局變數, C語言提供了另外一個用於修改全局變數的關鍵字, static
只要用static修改的全局變數就是內部全局變數, 只能在當前文件中使用
這樣就可以提高我們全局變數的安全性
如果多個文件中存在同名的內部全局變數, 相互不會影響
如果既有外部全局變數也有內部全局變數, 那麼會優先訪問內部全局變數
用於聲明一個外部全局變數
聲明只需要在使用變數之前聲明就可以了
用於定義一個內部全局變數
聲明和定義的區別:
聲明不會開辟存儲空間
定義會開辟存儲空間
4. C語言筆記——取值范圍
這章主要是留作備用,作為補充知識的吧,不過常用的數據類型的取值范圍還是得做一下了解,並且記住的。
這里得先明確幾個個概念:
那麼一個位元組的大小能表示多大的數呢?
11111111b = FFh = 255
所以我們可以看出,在無符號位的情況下,一個位元組就能表示 0 ~ 255 的數。
通常,在有符號情況下,也就是變數類型之前有 signed 這樣的情況下,8 個比特位的第一位為符號位。
關系為:如果符號位是 0 ,那麼這就是一個正數;如果符號位為 1 ,那麼這就是一個負數。
那麼們舉個栗子:
一個 int 型的變數,默認是 signed int 並且是 4 個位元組的,那麼就佔有 8 * 4 = 32 個比特位,同時他第一位是符號位,那麼就只有 31 個比特位是表示數值的,表示的大小就是 -2的31次方~2的31次方
這里引入一個補碼的概念,雖然我並不知道這個有啥用,但是我看教程都講了,那就也寫一下吧。
5. C語言要背哪些
main函數和其他函數;頭文件,數據說明等。
考試要求熟悉Visual C++2010 Express集成開發環境;掌握結構化程序設計的方法,具有良好的程序設計風格;掌握程序設計中簡單的數據結構和演算法並能閱讀簡單的程序;在Visual C++2010 Express集成環境下,能夠編寫簡單的C程序,並具有基本的糾錯和調試程序的能力。
要求學習程序的構成,main函數和其他函數;頭文件,數據說明,函數的開始和結束標志以及程序中的注釋;源程序的書寫格式;C語言的風格;C的數據類型(基本類型,構造類型,指針類型,無值類型)及其定義方法;C運算符的種類、運算優先順序和結合性;不同類型數據間的轉換與運算。
(5)c語言的筆記大全擴展閱讀:
二級C語言考試的相關要求規定:
1、其中3月份和9月份考試開考全部級別全部科目,12月份考試開考一、二級的全部科目。各省級承辦機構可根據實際情況決定是否開考12月份考試。
2、教育部考試中心確定從2013年上半年開始,實施無紙化的NCRE,二級6個科目是:二級C、二級VB、二級VFP、二級JAVA、二級ACCESS、二級C++。取消「Delphi語言程序設計」科目(代碼:62)。
3、考生不受年齡、職業、學歷等背景的限制,任何人均可根據自己學習和使用計算機的實際情況報考。每次考試報名的具體時間由各省(自治區、直轄市)級承辦機構規定。考生按照有關規定到就近考點報名。
6. C語言概念大全
因為我是學習計算機軟體專業的,所以我要告訴你的一個重要經驗就是:如果真的要想熟練掌握計算機編程技能(其實任何編程語言都一樣),那麼就必須要:一定、且多親自上機實踐才行!!絕對不能夠只是在書本上讀 C 語言程序、研究 C 語言程序的基本概念、語法結構、關鍵字等,那樣絕對是無法掌握編程技能的!!!因為這些 C 語言的概念不是憑空就能夠掌握的,這些概念的熟練掌握和理解是通過編寫了足夠多的程序之後,才能夠從中領悟到的(尤其是 C 語言的指針功能是極其強大的,如果光靠看書,那是絕對無法掌握的,必須要靠編寫足夠多的 C 語言程序之後,才能夠對 C 語言的指針功能有一個較深的理解)。
要想熟練掌握計算機編程技能,那麼首先要有一台屬於自己的電腦、並安裝好操作系統,且安裝好相應的程序編譯開發環境,然後購買一本難度適合自己的編程教材,親自動手上機編寫、編譯、鏈接、直到調試通過教材中的所有源程序(包括每一章的例題、以及每一章後面的練習題)。
只要你真正能夠做到一直堅持下去,我保證你肯定可以熟練掌握好計算機程序設計語言。
7. C學習筆記(一) C語言和匯編語言的區別
C學習筆記(一) C語言和匯編語言的區別
2016-07-11 09:43162人閱讀評論(0)收藏舉報
分類:
C學習筆記(13)
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
C學習筆記(五)C語言和匯編語言的區別
C語言和匯編語言的區別:
匯編:效率高,對硬體的可操控性更強,體積小,不易維護,可移植性很差;
C:效率比較低,硬體可操控性比較差,目標代碼體積大,容易維護,可移植性很好。
匯編語言運行效率高的原因:
1.匯編語言實質上是機器語言的助記符。 CPU只能運行它所支持的指令集,而這些指令集當中的每條指令都是一些二進制數的序列,也就是「0」和「1」的有序組合;「0」和「1」的組合不便於程序員的記憶因此有了「MOV A 0x40」等這樣的助記符。所以匯編語言編譯成CPU可執行的機器語言其實只要做一個翻譯的動作就好了。而C語言編寫完程序後,需要通過編譯器將C語言編譯成與相應CPU指令集對應的機器語言。匯編語言與機器語言是一一對應的。但是C語言呢?當然沒這么好事了。C語言的語法是固定的,C語言編寫的程序要編譯成CPU能讀懂的機器語言指令沒辦法一一對應,因此需要有編譯規則了,所以運行效率低一些。也可以說,C語言,是面向程序員的語言,而匯編語言是直接面向CPU的語言。
2.匯編是直接面對CPU的語言,只要是在指令集支持的范圍內,匯編語言可以直接而靈活地管理包括特殊功能寄存器、通用寄存器、存儲單元的每一個位元組,甚至是每一個bit。C語言對內存的使用及管理功能也是很強大的,但畢竟還是受制於語法。舉個最簡單的例子,C語言當中沒有對應三位元組或是五位元組的變數類型,要麼int型,要麼long型,所以每次申請必須是固定的位元組數,勢必造成內存使用上的浪費。而大部份匯編語言根本沒有這樣的語法,在偽指令的幫助下(其實也只是提高可讀性),匯編語言程序可以使用任意位元組數的變數,當然處理起來比C語言麻煩得多,最終還是一個位元組一個位元組地拼接處理,而用C語言寫程序就輕鬆了,不用管這些,最終編譯器會搞定嘛。而輕松的代價就是造成了浪費。而內存使用效率不高同時也會影響到整個程序的整體效率。
C語言與匯編的不同適用場合
1:若只有較簡單的邏輯操作、邏輯演算法、簡單運算,使用匯編會得到較為精準的代碼,但用c也同樣可以做到。
2:若摻有復雜運算、浮點運算、非線性方程等,匯編難度很大,而C語言作為一種高級語言,有簡潔緊湊,使用靈活的語法機制,編寫復雜程序容易得多。
3:每一款處理器各自的匯編語法大都不一樣,若僅使用匯編,可擴充性、可移植性都很差,用c就會好的多。
4:對硬體進行初始化的操作,使用匯編語言。
8. 學c語言如何做筆記
我自學C語言的時候的筆記只記程序,然後在程序旁邊寫下程序中新學的知識,比如
剛學的時候
#include <stdio.h>
main()
{
printf("Hello!");
}
每個C程序的基本格式是:
#include <stdio.h>
main()
{
printf("Hello!");
}
後來學到
#include <stdio.h>
main()
{
int x;-----要用的變數,先聲明,
x=1;
printf("x=%d",x);----^.....
}
如此類推了,這樣不了解就可以運行程序式式,我自己感覺還不錯,就是有時候,要寫太多了.
9. 數據結構筆記(C語言版)嚴蔚敏
線性表的單鏈表存儲結構(帶頭節點):
循環鏈表 :最後一個結點的指針域指向頭結點,整個鏈表形成一個環。
雙向鏈表的結點中有兩個指針域,其一指向直接後繼,另一個指向直接前驅。
棧 :是限定僅在表尾進行插入和刪除操作的線性表,因此,表尾段稱為 棧頂 ,表頭端稱為 棧底 。
LIFO:last in first out,後進先出。
若base=NULL表示棧不存在,top==base可以作為棧空的標記。每當插入新的棧頂元素時,指針top+1,刪除棧頂元素時,top-1,所以, 非空棧中的top指針始終在棧頂元素的下一個位置上 。
建立二叉樹與遍歷
10. C語言筆記(五)----struct,enum,typedef等
成員表列由若干個成員組成,每個成員都是該結構的一個組成部分。
對每個成員也必須做類型聲明。
其形式為:
類型聲明符 成員名;
例如:
注意, 最後括弧外面的;分號是不可少的 。
結構定義之後,才可以進行變數聲明。
凡聲明為結構 stu 的變數都由上述4個成員組成。
由此可見,結構是一種復雜的數據類型,是數目固定,類型不同的若干有序變數的集合。
聲明結構變數 有以下三種方法。
使用上面定義的stu為例:
如:
也可以用宏定義使一個符號常量來表示一個結構類型。例如:
例如:
這種形式的聲明的一般形式為:
例如:
這種聲明的一般形式為:
第三種方法與第二種方法的區別在於第三種方法中省去了結構名,而直接給出結構變數。
在程序中使用結構變數時,往往不把她作為一個整體來使用。
在ANSI C中除了允許有相同類型的結構變數相互賦值以外,一般對結構變數的使用,包括 賦值、輸入、輸出、運算 等都是通過結構變數的成員來實現的。
表示結構變數成員的一般形式為:
結構變數名.成員名
例如: boy1.num boy2.sex
如果成員本身又是一個結構,則必須逐級找到最低級的成員才能使用。如: boy1.birthday.month
結構變數的賦值就是給各成員賦值。
數組的元素也可以是結構類型的。
因此可以構成結構型數組。
初始化賦值:
當然也可以在定義 stu結構 時同時聲明 pstu。
賦值是把結構變數的首地址賦予該指針變數,不能把結構名賦予該指針變數。
如果 boy 是被聲明為 stu類型 的結構變數。
則:
有了結構指針變數,就能更方便地訪問結構變數的各個成員。
其訪問的一般形式為:
(*結構指針變數).成員名
或
結構指針變數->成員名
例如: (*pstu).num 或 pstu->num
例如:
介紹數組的時候,曾介紹過數組的長度是預先定義好的,在整個程序中固定不變。
C語言中不允許動態數組類型。
例如:
但是又有此需求,為了解決這個問題,C語言提供了一些內存管理函數,這些內存管理函數可以按需要動態地分配內存空間,也可把不再使用的空間回收待用,為有效地利用內存資源提供了手段。
常用的內存管理函數有3個:
例子:分配一塊區域,輸入一個學生數據
上面的例子採用了動態分配的辦法為一個結構分配內存空間。
每一次分配一塊空間可用來存放一個學生的數據,我們可稱之為一個節點。
有多少個學生就應該申請分配多少塊內存空間,也就是說要建立多少個節點。
當然用結構數組也可以完成上述工作,但如果預先不能准確把握學生人數,也就無法確定數組大小。
而且當學生留級、退學之後也不能把該元素佔用的空間從數組中釋放出來。
用動態存儲的方法可以很好地解決這些問題。
有一個學生就分配一個節點,無須預先確定學生的准確人數,某學生退學,可刪去該節點,並釋放該節點佔用的存儲空間,從而節約了寶貴的內存資源。
另一方面,用數組的方法必須佔用一塊連續的內存區域。
而使用動態分配時,每個節點之間可以是不連續的(節點內是連續的)。
節點之間的關系可以用指針實現。
即在節點結構中定義一個成員項來存放下一節點的首地址,這個用於存放地址的成員,常把他稱為指針域。
可在第一個節點的指針域內 存入第二個節點的首地址,在第二個節點的指針域內 又存入第三個節點的首地址,如此串聯下去直到最後一個節點。
最後一個節點因無後續節點連接,其指針域可賦值 0
這種連接方式,在數據結構中稱為「鏈表」。
鏈表的基本操作主要有以下幾種:
例子:建立一個三個節點的鏈表,存放學生數據。為簡單起見,我們假定學生數據結構中只有學號和年齡兩項。可編寫一個建立鏈表的函數create。程序如下:
create函數 用於建立一個有 n個節點 的鏈表,他是一個指針函數,他返回的指針指向 stu結構。
在create函數內定義了三個 stu結構 的指針變數。
head為頭指針,pf為指向兩相鄰節點的前一節點的指針變數。
pb為後一節點的指針變數。
枚舉是一種 基本數據類型 ,而不是一種 構造類型 ,因為他不能再分解為任何基本類型。
enum 枚舉名{ 枚舉值表 };
例如: enum weekday { sun,mou,tue,wed,thu,fri,sat };
enum weeakday a,b,c;
或者為:
enum weekday { sun,mou,tue,wed,thu,fri,sat }a,b,c;
或者為:
enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
例子:
說明:
只能把枚舉值賦予枚舉變數,不能把元素的數值直接賦予枚舉變數。如:
a=sun;b=mon; 是正確的
a=0;b=1; 是錯誤的。
如果一定要把數值賦予枚舉變數,則必須使用強制類型轉換。
如: a=(enum weekday)2;
還應該說明的是枚舉元素不是字元常量也不是字元串常量,使用時不要加單、雙引號。
例子:
typedef定義的一般形式為:
typedef 原類型名 新類型名
其中原類型名中含有定義部分,新類型名一般用大寫表示,一般用大寫表示,以便於區別。
有時也可用 宏定義 來代替 typedef 功能,但是 宏定義 是由 預處理 完成的,而 typedef 則是 在編譯時 完成的,後者更為靈活方便。
使用 typedef 定義數組、指針、結構等類型將帶來很大的方便,不僅使書寫簡單而且使意義更加明確,因而增強了可讀性。
例如:
又如: