1. 程式人生 > >陣列結構體總結(C語言)

陣列結構體總結(C語言)

陣列

定義:陣列是有序的並且具有相同型別的資料的集合。

一維陣列

1、一般形式:型別說明符 陣列名[常量表達式];例如: int a[10]; 元素為a[0]----a[9].

2、常量表達式中不允許包含變數,可以包含常量或符號常量。

3、陣列元素下標可以是任何整型常量、整型變數或任何整型表示式。

4、可以對陣列元素賦值,陣列元素也可以參與運算,與簡單變數一樣使用。

5、使用數值型陣列時,不可以一次引用整個陣列,只能逐個引用元素。

6、需要整體賦值時只可以在定義的同時整體賦值。如

   int a[10]={0,1,2,3,4,5,6,7,8,9};正確。

   int a[10];    a[10]={0,1,2,3,4,5,6,7,8,9};錯誤。

或者用記憶體拷貝函式

7、可以只給一部分元素賦值。例如:

   int a[10]={5,8,7,6};後面沒有賦值的元素值預設為0。

8、對全部陣列元素賦值時可以不指定陣列長度,例如:

   int a[10]={0,1,2,3,4,5,6,7,8,9};可以寫成 int a[]={0,1,2,3,4,5,6,7,8,9};

   但是,既不賦初值,也不指定長度是錯誤的。例如:int a[];錯誤。

9、指向陣列元素的指標

     int a[10], *p; 

//下面這兩句是等價的:     p=&a[0];      p=a; 根據地址運算規則, a+1為a[1]的地址, a+i就為a[i]的地址。 

    下面我們用指標給出陣列元素的地址和內容的幾種表示形式。     (1). p+i和a+i均表示a[i]的地址, 或者講, 它們均指向陣列第i號元素, 即 指向a[i]。     (2). *(p+i)和*(a+i)都表示p+i和a+i所指物件的內容, 即為a[i]。     (3). 指向陣列元素的指標, 也可以表示成陣列的形式, 也就是說,  它允許 指標變數帶下標, 如p[i]與*(p+i)等價。 

二維陣列

1、一般形式:型別說明符 陣列名[常量表達式1][常量表達式2];例如: 

   int a[3][4];可以看成是包含3個一維陣列,每個一維數組裡包含4個元素。一共3*4=12個元素。 

   所有元素為 a[0][0],a[0][1],a[0][2],a[0][3]

              a[1][0],a[1][1],a[1][2],a[1][3]

              a[2][0],a[2][1],a[2][2],a[2][3]

┏━━━━┓┏━┳━┳━┳━┓

 a─→  a[0]    ─→┣━━━━┫┣━╋━╋━╋━┫  a[1]    ─→┣━━━━┫┣━╋━╋━╋━┫  a[2]    ─→1011┗━━━━┛┗━┻━┻━┻━┛

a代表二維陣列的首地址,  當然也可看成是二維 陣列第0行的首地址。a+1就代表第1行的首地址, a+2就代表第2行的首地址。如 果此二維陣列的首地址為1000, 由於第0行有4個整型元素, 所以a+1為1008, a+2 也就為1016(16位)。如下圖所示                             a[3][4]                      a    ┏━┳━┳━┳━┓              (1000)─→                    a+1  ┣━╋━╋━╋━┫              (1008)─→                    a+2  ┣━╋━╋━╋━┫              (1016)─→1011┗━┻━┻━┻━┛

2、與一維陣列一樣元素下標可以是是任何整型常量、整型變數或任何整型表示式。

3、需要整體賦值時只可以在定義的同時整體賦值。例如:

   int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};正確。

   int a[3][4];  a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};錯誤。

4、可以把所有資料寫在一個花括號內。例如:

   int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};正確。

5、可以只對部分元素賦值。例如:

   int a[3][4]={{1},{5},{9}};其餘未賦值的元素預設為0。

   int a[3][4]={{1},{5,6}};可以看成是int a[3][4]={{1,0,0,0},{5,6,0,0},{0,0,0,0}};

6、對全部陣列元素賦值時可以省略第一維長度,第二維不可以省略。例如:

   a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

   可以寫成a[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

   或者a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

7、在二維陣列中, 我們還可用指標的形式來表示各元素的地址。

a[0]與*(a+0)等價, a[1]與*(a+1)等價, 因此a[i]+j就與*(a+i)+j等價, 它 表示陣列元素a[i][j]的地址。 

因此, 二維陣列元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j),  它們都與 a[i][j]等價, 或者還可寫成(*(a+i))[j]。

字元陣列

1、定義:char a[10];字元陣列a長度為10。每個元素只能存放一個字元。例如:

   a[0]='h';a[1]='a';a[2]='p';……

2、初始化:

   char a[]={'h','a','p','p','y'};注意,長度為5

   char a[]="happy";

   char a[]={"happy"}; 注意,因為字串結尾自動加'\0',所以char a[]="happy";長度為6,不是5。

3、C語言中沒有字串變數,字串的輸入、儲存、處理和輸出等必須通過字元陣列實現。  只能是陣列指標都不行!

4、字串的輸入。

   scanf();可以用%C逐個字元輸入比如char a[6];for(i=0;i<6;i++) scanf("%c",&a[i]);

           可以用%S以字串的形式輸入,比如char a[6];scanf("%s",a);注意,a前不用加&,因為a是陣列名,已經代表了陣列首地址。

注意:以%S輸入時,以第一個非空白字元開始,終止於第一個空白字元。比如:輸入How are you時。只輸出How.

   gets();作用為輸入一個字串。與scanf();功能一致,但空格和回車都存放在陣列中,最後自動加入‘\0’.不會出現上面輸出不全的情況。

         呼叫方式為:gets(陣列名);需要包含標頭檔案“stdio.h”.

5、字串的輸出。

    printf();可以使用%C逐個字元輸出,比如:char a[6];for(i=0;i<6;i++) printf("%c",a[i]);

           可以用%S以字串的形式輸出,比如char a[6];printf("%s",a);

    puts();輸出一個字串,結尾自動換行。

         呼叫形式:puts(字元陣列名或字串常量);需包含標頭檔案“stdio.h”

常用字串處理函式(以下函式需要標頭檔案“string.h”)

1、strlen()作用是測試字串長度。這裡不包括‘\0’.使用形式strlen(陣列名或字串常量)

2、strcat()作用是連線兩個字串。呼叫方式strcat(字元陣列1名,字元陣列2名);合併後的字串存放在字元陣列1中。

3、strcmp()比較兩個字串是否相等。呼叫方式strcmp(字串1,字串2);相等時值為0。1>2時為正數。1<2時為負數。

4、strcpy()複製字串。呼叫方式strcpy(字元陣列1,字串2);2的內容複製到1中。1只能是字元陣列名。

指標陣列1、定義int *p[10];//指標陣列,含有10個指標元素也就是說每一個元素都是指標

2、初始化:

char *week_day[8]= 

{"sunday", 

"monday", 

"tuesday",

"wednesday", 

"thursday", 

"friday", 

"saturday", 

NULL 

}; /* 說明指標陣列。陣列中的每個元素指向一個字串 */ 

char *week_day[8];

陣列必須指定大小,char *week_day[];是錯誤的。

可以不指定陣列大小

char * week_day []=

{"sunday", 

"monday", 

"tuesday",

"wednesday", 

"thursday", 

"friday", 

"saturday", 

NULL 

};

3、使用

int *p[10];

p[0]=”asdfghj”;

char *a=”asdfghjk”; 

p[1]=a;

4、指向結構體的指標陣列

 typedef struct { 

char s1[81]; 

char s2[81];

char s3[81]; 

} Rec; 

Rec *a[10];

a[0]=(Rec *)malloc(sizeof(Rec)); 

strcpy(a[0]->s1, "hello"); 

free(a[0]);

如右圖所示:

5、指向函式的指標陣列

    int functionA(int event);

        int functionB(int event);

…….

    int functionZ(int event);

  typdef  int (*pFunc)(int event);   // pFunc 是 int (*)(int event)的別名

  pFunc  functionlist[Z+1] =

functionA,

 functionB, 

…  ,

functionZ 

}; //指向函式名串的指標陣列 

  使用:

functionlist[i](event);

陣列指標

1、定義:

型別說明符  (*指標變數名)[長度]

注意“(*指標變數名)”兩邊的括號不可少。int (*p)[10];//陣列指標,這個指標能夠用來指向含有10個元素的整數陣列

2、使用

int a[10], b[3][4],

p = &a;  注意,取一次地址地址相當於加一級指標

p=b;

*p+1指向b[0][1], *(p+i)+j則指向陣列元素b[i][j]。

結構體陣列

1、 結構體陣列的定義

對應結構體變數定義方法1

struct student

{

 long num;

   char name[20];

char sex;

   char addr[20];

}

struct student students[3];

struct 

{

 long num;

   char name[20];

char sex;

   char addr[20];

} students[3]

2、結構體陣列的初始化

   初始化方法:在定義陣列的後面加上  ={初值列表}

struct 

{  long num;

         char name[20];

         char sex;

         char addr[20];

}   students[3]={ {10101, "Li Lin", 'M', "Beijing"},{10102, "zhang",  'F',  "shanghai"} ...}

3、使用

students [i].sex=‘F’;

陣列作為函式引數

1、 陣列元素作函式實參

陣列元素作函式實參,與用變數作實參一樣,是“單向的值傳遞”。

引數和形參型別要保持一致。

Fun(a[2]);//傳遞的是元素a[2]的值。

2、 陣列名作函式的實參和形參。

如:

main()

{int array[10];

   ……

 f(array,10);

……

}

 f(int arr[],int n);

     {    ……

}//注意sizeof(arr)值為4,此處只是傳遞陣列的第一個元素的地址。

array為實引數組名,arr為形引數組名。陣列名就是陣列的首地址,實參向形參傳送陣列名實際上就是傳送陣列的地址,形參得到該地址後也指向同一陣列。這就好象同一件物品有兩個彼此不同的名稱一樣。

同樣,指標變數的值也是地址,陣列指標變數的值即為陣列的首地址,也可作為函式的引數使用。

用陣列名作為函式引數時還應注意以下幾點:

a. 形引數組和實引數組的型別必須一致,否則將引起錯誤。

b. 形引數組和實引數組的長度可以不相同,因為在呼叫時,只傳送首地址而不檢查形引數組的長度。當形引數組的長度與實引數組不一致時,雖不至於出現語法錯誤(編譯能通過),但程式執行結果將與實際不符,這是應予以注意的。

c. 在函式形參表中,允許不給出形引數組的長度,或用一個變數來表示陣列元素的個數。

例如,可以寫為:

void fun(int a[])

或寫為

void fun(int a[],int n)

其中形引數組a沒有給出長度,而由n值動態地表示陣列的長度。n的值由主調函式的實參進行傳送。

d. 多維陣列也可以作為函式的引數。在函式定義時對形引數組可以指定每一維的長度,也可省去第一維的長度。因此,以下寫法都是合法的。

      int MA(int a[3][10])

int MA(int a[][10])。

而int  MA (int a[3][]);是不允許的。

相關推薦

陣列結構總結C語言

陣列 定義:陣列是有序的並且具有相同型別的資料的集合。 一維陣列 1、一般形式:型別說明符 陣列名[常量表達式];例如: int a[10]; 元素為a[0]----a[9]. 2、常量表達式中不允許包含變數,可以包含常量或符號常量。 3、陣列元素下標可以是任何整型常量、整型變數或任何整型表示式。

字串、陣列、指標總結C語言

一、字串常量 位於一對雙引號中的任意字元,如果字串文字中間沒有間隔或間隔是空格符,ANSI C會將它串起來。例如 char str[50]="hello" "wo" "you!";  和   char st[50]="wo,nihao!";  &nbs

PAT甲級題目記錄總結C++語言

1120 Friend Numbers 題目翻譯: 如果兩個整數各位數之和相等,那麼這兩個數稱為“friend numbers”,和稱為“friend ID”。例如,123和51就是“friend numbers”,因為1+2+3=5+1=6,6為“fri

資料結構與演算法C語言 | 二叉排序樹

二叉排序樹的定義—— 二叉排序樹 ( Binary Sort Tree) 或者為空;或者是具有如下特性的二叉樹: (1)若根的左子樹不空,則左子樹上所有結點的關鍵字均小於根結點的關鍵字; (2)若

資料結構-順序佇列C語言

佇列:插入資料只在隊尾進行,刪除資料只在隊頭進行。 順序佇列操作會出現 假溢位(tail指向佇列最後,進行入隊操作時,即使前面有空位置也顯示佇列已滿) 解決: 1.在出隊操作後,增加移動元素操作。每次進行完出隊操作後,佇列中後面的元素向前移動,始終保持佇列第一個位置有元素。

線性表總結c語言

線性表 線性表特點 存在一個唯一的一個被稱作”第一個”的資料元素 存在唯一的一個被稱做”最後一個”的資料元素 除第一個之外,集合中的每個資料元素均只有一個前驅 除最後一個之外,集合中每個資料元素均只有一個後繼 定義 一個線性表是n個數據元素的

資料結構與演算法C語言 | 線性表順序儲存、鏈式儲存

   線性表是最常用最簡單的線性結構    線性結構具有以下基本特徵: 線性結構是一個數據元素的有序(次序)集(處理元素有限)。若該集合非空,則 1)必存在唯一的一個“第一元素”; 2)必存在唯一的一個“最後元素”; 3)除第一元素之外,其餘每個元素均有唯一的前

資料結構c語言—— 七大排序演算法總結

排序是資料結構最重要的演算法之一,在這裡整理一下七大排序演算法的思路及程式碼。 排序分為以下四類共七種排序方法: 插入排序:1) 直接插入排序     2) 希爾排序 選擇排序:3) 直接選擇排序     4) 堆排序 交換排序:5) 氣泡排序           

結構的初始化和引用及指向結構變數的指標變數C語言

一、首先我們來了解關於結構體以及結構體陣列的概念。 自定義結構體: struct weapon{ char name[20]; int atk; int price; }; 它是"weapon"型(類似於我們熟知的int型,String型等),裡

資料結構——稀疏矩陣運算器C語言

資料結構——稀疏矩陣運算器(C語言) /*****************稀疏矩陣運算器 ****************/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define TRUE

資料結構c語言——鏈棧儲存結構及實現

鏈棧:就是一種特殊的單鏈表,FILO(先進後出) 通常對於連結串列來說: 1.是不需要頭節點的。 2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。   不多bibi你們都懂哈,直接上程式碼:  鏈棧結構: typedef struct Stock

資料結構c語言——雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struct DulNode *

hdu 2015 偶數求和陣列,呼叫函式,c語言

hdu 2015 偶數求和 點選做題網站連結 題目描述 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Description 有一個長度為n

hdu 2014 青年歌手大獎賽_評委會打分陣列,呼叫函式,c語言

hdu 2014 青年歌手大獎賽_評委會打分 點選做題網站連結 題目描述 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Descriptio

資料結構中,幾種樹的結構表示方法C語言實現

//***************************************** //樹的多種結構定義 //***************************************** #define MAX_TREE_SIZE 100 typedef int TempType;

演算法4-7:KMP演算法中的模式串移動陣列c語言

題目描述 字串的子串定位稱為模式匹配,模式匹配可以有多種方法。簡單的演算法可以使用兩重巢狀迴圈,時間複雜度為母串與子串長度的乘積。而KMP演算法相對來說在時間複雜度上要好得多,為母串與子串長度的和。但其算符比較難以理解。 在KMP演算法中,使用到了一個next陣列。這個陣列就是在比較

對二維陣列使用指標進行操作的探索C語言

1 /* 2 Name: 對二維陣列使用指標進行操作的探索 3 Copyright: 4 Author: lingr7 5 Date: 01/12/18 11:55 6 Description: 7 */ 8 #include<stdi

【資料結構】順序佇列的實現C語言

佇列的基本概念及其描述 佇列是一種特殊的線性表,它的特殊性在於佇列的插入和刪除操作分別在表的兩端進行。 插入的那一端稱為隊尾,刪除的那一端稱為隊首。佇列的插入操作和刪除操作分別稱為進隊和出隊。 先進先出(First In First Out) 順序佇列要掌握以下操作:

資料結構複習筆記——靜態順序表C語言

定義結構體 typedef struct{ int data[MAXSIZE]; //MAXSIZE為最大容量 int length; //當前長度 } Array; 建立順序表 /* 需要接受一個已知的陣列,以及該陣列的長度 按順序將陣列內的值,賦給順

Linux學習筆記演算法與資料結構之 佇列程式碼C語言

1、程式碼在VS2010的C++編譯器中編譯通過,可能有極少部分語法不符合C89標準;bool型別無法使用,用int代替 2、由於VS配置問題,沒有分.c和.h檔案書寫;如果要分,最好將Create_Node和Destory_Node加上static關鍵字修飾,他們只會在所