陣列結構體總結(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、一般形式:型別說明符 陣列名[常量表達式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] ┃─→┃0 ┃1 ┃2 ┃3 ┃┣━━━━┫┣━╋━╋━╋━┫┃ a[1] ┃─→┃4 ┃5 ┃6 ┃7 ┃┣━━━━┫┣━╋━╋━╋━┫┃ a[2] ┃─→┃8 ┃9 ┃10┃11┃┗━━━━┛┗━┻━┻━┻━┛
a代表二維陣列的首地址, 當然也可看成是二維 陣列第0行的首地址。a+1就代表第1行的首地址, a+2就代表第2行的首地址。如 果此二維陣列的首地址為1000, 由於第0行有4個整型元素, 所以a+1為1008, a+2 也就為1016(16位)。如下圖所示 a[3][4] a ┏━┳━┳━┳━┓ (1000)─→┃0 ┃1 ┃2 ┃3 ┃ a+1 ┣━╋━╋━╋━┫ (1008)─→┃4 ┃5 ┃6 ┃7 ┃ a+2 ┣━╋━╋━╋━┫ (1016)─→┃8 ┃9 ┃10┃11┃┗━┻━┻━┻━┛
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關鍵字修飾,他們只會在所