C語言---數據結構(內建,數組,自定義)


數組是一組有序數據的集合,每個元素都屬於同一個數據類型。

一維數組的定義:

類型符  數組名[常量表達式]

常量表達式中,可以包括常量和符號常量,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;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM