數組是一組有序數據的集合,每個元素都屬於同一個數據類型。
一維數組的定義:
類型符 數組名[常量表達式]
常量表達式中,可以包括常量和符號常量,int a[3+5]是合法的。但是不能包含int a[n],C語言不允許動態數組。
子函數中是可以存在int a[2*n]的,但是不能是static局部變量,因為子函數中的數據在執行時,n已經確認,可以在
棧中分配出int n[2*n]的地址空間。
在定義時,初始化:
1) int a[10] = {0,1,2,...,9}; //使用{}l=括號
2) int a[10] = {0,1,2,3,4}; //部分賦值,未賦值的元素自動賦值0
3) int a[] ={1,2,3,4,5}; //可以不需要指定數組長度
一維數據的引用,數組名[下標]
二維數據定義:
類型符 數組名[常量表達式][常量表達式]
二維數組的引用 數組名[下標][下標]
二維數組的初始化
1) int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //每個行元素單獨賦值
2) int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //所有元素寫在一起賦值
3) int a[3][4] = {{1},{5},{9}}; //對每個行元素,都部分賦值
4) int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //C語言可自動推斷出行元素個數
用來存放字符的數組,字符數組。其中的每個元素存放一個字符。最后自動加空字符'\0'
char [10];
字符數組的初始化,char c[10] = {'I',' ','a',....'y'}; //' '表示空格
C中的字符串是通過字符數組的形式來處理的,結束標志'\0',在ASCII中表示0。
可以通過字符串來對字符數組進行賦值。
char[] = "I am happy";
如果定義的字符數據長度比字符長,系統自動補'\0'
char c[10] = {"china"}; printf("%s",c); //輸出只打印到第5個字符
C語言函數提供的字符串處理的函數。必須包含#include<string.h>
1) puts(字符數組);
char str[] = {"string"}; puts(str); //輸出時將'\0'轉換為\n,
2) gets(字符數組);
char str[10]; gets(str); //輸入字符,自動加'\0'
puts和gets函數只能處理一個字符數組。
3) strcat(字符串1,字符串2);
char str1[30] = {""};
char str2[] = {"china"};
printf("%s", strcat(str1,str2)); //str1必須足夠大,將str2鏈接到str1后
4) strcpy(字符數字1,字符串2);
char str1[10],str2[] = "china";
strcpy(str1,str2); //str1只能是數組名的形式,字符數組1必須定義的足夠大,
//賦值時,只是將6個元素,放在str1的前6個單元(包括'\0'),之后的4個單元,仍是str1的字符。
strncpy(str1,str2,n); //將str2的前n個字符,copy到str1的前n個字符,不包括'\0'。‘’
//字符串之間不能直接用str1 = str2
5) strcmp(字符串1,字符串2);
strcmp(str1,str2); //比較str1和str2,直到出現不同的字符和'\0'為止。
//str1 == str2,則返回值0,str1 > str2, 則返回正整數,str1 < str2, 則返回負整數
//字符串之間不能直接用 str1 > str2
6) strlen(字符數組);
char str[10] = "China";
printf("%d", strlen(str)); //輸出結果為5,表示實際的字符的個數,不包括'\0'
7) strlwr(字符串); //將字符串的大寫轉換為小寫字母
8) strupr(字符串); //將字符串的小寫轉換為大寫字母
用戶自定義結構體類型:
struct 結構體名 {成員表列};
struct Student {int num; char name[20];} student1;
定義結構體變量:
結構體名 結構體變量
struct Student student1; //必須加struct來執行結構體類型名
也可以不指定類型名,直接指定結構體變量
struct {int num; char name[20];} student1;
1)在定義結構體變量時,初始化:
struct Student b = {.name = "zhang"}; //對結構體成員的引用,必須使用成員運算符"."
struct Student b = {name :"zhang”};
struct Student b = {"zhang"}
2)通過結構體變量名.成員名來引用結構體變量的成員
student1.num = 10010;
3)如果成員本身就是一個結構體,可以多次使用"."來引用:
student1.birthday.month
4)同類型的結構體變量可以相互賦值:
student1 = student2;
5)可以引用結構體變量的地址,也可以引用結構體變量成員的地址:
&student1.num &student1
結構體類型的指針,只能通過->來引用其中的成員變量
定義結構體數組:
結構體類型 數組名[數組長度]
struct Person leader[3];
定義結構體指針:
struct Student *pt; //如果p指向一個結構體變量stu,結構體變量.成員名(stu.num)
(*p).成員名((*p).num)
p->成員名(p->num)等價
指向結構體數組的指針
struct Student {int num; char name[];};
struct Student stu[3];
struct Student *p;
for(p=stu; p <stu +3; p++);
用結構體變量的數組或指針做函數參數
void input(struct Student stu[]);
共用體類型,同一段存儲空間中,存儲不同的數據結構,每次只能選擇一種。
定義共用體變量:
union 共用體名 {成員表列} 變量表列;
union Data {int i; char ch; float f;} a,b,c;
引用共用體變量: a.i、a.ch、a.f
使用共用體類型數據時,同一內存段某一時間段內,只能用來存放一種數據結構
共用體中起作用的是最后一次被賦值的元素。
a.ch = 'a'; a.f = 1.5; a.i=40; //a中的值為40
共用體指針,也是通過.來引用其中的變量
如果一個變量的值只能是幾種可能的值,可以定義為枚舉(enum)類型
聲明枚舉類型: enum [枚舉名] {枚舉元素列表}
enum Weekend {sun, mon, tue, wed, thu, fri, sat};
聲明枚舉變量: 枚舉類型名 變量名
enum Weekend workday;
C編譯器對枚舉元素是按常量來處理的。故稱為枚舉常量,所以不能對枚舉變量進行賦值。
C語言按順序,對他們進行賦值0,1,2,,,
printf("%d", workday); //輸出相應的值
用typedef來重新聲明類型。
typedef int integer;
typedef struct {int month; int day; int year;} Date; //聲明一個新類型名Date
typedef int Num[100]; //聲明Num為整型數組類型名 Num a; a為整型數組名,有100個元素
NUM n; n就是一個數組,含有100個元素
typedef char * String; //String p,定義String為字符類型指針
typedef int (*Pointer) (); //聲明Pointer為指向函數的指針類型
結構體中允許嵌套:
1)結構體的自引用,結構體內部,包含指向自身類型的結構體指針;
2)結構體的相互引用,結構體內部,包含指向其他類型的結構體的指針;
需要注意:
1)結構體中可以嵌套其他結構體類型的變量,但是不能嵌套自己結構體類型的變量;
2)可以嵌套自己類型的結構體指針;
自我嵌套時:
struct tag1 {
struct tag1 A; //不可以嵌套自己類型的變量,這樣在編譯時,無法分配正確的空間
int value;
}
struct tag1 {
struct tag1 *A; //可以嵌套自己類型的變量指針,在編譯時,只分配一個int類型的指針就可以
int value;
}
相互嵌套時:
typedef struct taga { //由於B類型聲明在后邊,所以此處不可以引用,需要先聲明B類型的結構體
B *bp;
int value;
} A;
typedef struct tagb {
A *ap;
int value;
} B;
先聲明結構體類型:
typedef struct taga A;
typedef struct tagb B;
struct taga {
B *bp;
int value;
}
struct tagb {
A *ap;
int value;
}