在c語言中, 陣列屬於構造資料型別。乙個陣列可以分解為多個陣列元素,這些陣列元素可以是基本資料型別或是構造型別。因此按陣列元素的型別不同,陣列又可分為數值陣列、字元陣列、指標陣列、結構陣列等各種類別。
//在編譯時明確指定全部元素為0
int a[10] = ;
//在程式執行時,重置記憶體塊為0
memset(a,0,sizeof(a));
陣列元素個數在初始化的時候可以明確指出也可以根據初始化列表元素個數確定。
c語言中的陣列有自己特定的型別:由元素型別和陣列長度決定
例:int array[5]的型別為int [5]
可以重新命名陣列型別,並用新的陣列型別名命名陣列變數,使用typedef關鍵字進行重新命名
typedef
int (myint5)[5];//myint5表示乙個含有5個元素的int型別的陣列
myint5 array;//相當於int array[5];
陣列名的技術盲點:
陣列首元素的位址和陣列位址是兩個不同的概念
陣列名代表陣列首元素的位址,它是個常量
變數本質是記憶體空間的別名,一定義陣列,就分配記憶體,記憶體就固定了。所以陣列名起名以後就不能被修改了。
陣列首元素的位址和陣列的位址值相等,但只是值相等而已
c語言規定:
int a[10];
printf("得到整個陣列的位址a: %d \n", &a);
printf("陣列的首元素的位址a: %d \n", a);
#include
#include
#include
#define array_size 5
int main(void)
for(i= 0;iprintf("%d\n",(*p_array)[i]);
}printf("hello world!\n");
return
0;}
直接定義陣列指標變數
#include
#include
#include
#define array_size 5
int main(void)
; p_array = &array;//將指標變數指向陣列型別的變數array,此時指標的步長是整個陣列長度
for(i= 0;i2*i+2;//通過指標運算元組記憶體空間
}for(i= 0;iprintf("%d\n",(*p_array)[i]);
}printf("hello world!\n");
return
0;}
本質推演
多維陣列名就是乙個陣列指標變數,指向除了最高維以外的剩餘維數的陣列
多維陣列名是乙個多級指標,取以後減少一級指標。同樣的對於二級指標,取*以後變成一級指標,二級指標指向一塊記憶體,常是乙個陣列,一級指標指向乙個陣列裡面的元素。
n級指標的值和n-1級指標的值(就是位址相等)重合,拿二維陣列來說,就是某一行整個行的位址(乙個陣列位址)和該行首元素的位址在相等,這是必然的,他們都是該片記憶體的起始位置,必然相等。但是他們的資料型別不一樣。n級指標指向的記憶體塊更多,n-1級指標指向的只是n級指標指向的記憶體塊的一部分,常是其中的乙個元素。
多維陣列char a[i][j] ==> ((a+i)+j)轉換技巧分析
示例程式
#define _crt_secure_no_warnings
#include
#include
#include
void main()
}for (i = 0; i<5; i++)
printf("\n");
}printf("hello...\n");
system("pause");
return;
}
執行結果
/*****
*****
****
aaa[0][0] = 1 aaa[0][1] = 2 aaa[0][2] = 3
aaa[1][0] = 2 aaa[1][1] = 3 aaa[1][2] = 4
aaa[2][0] = 3 aaa[2][1] = 4 aaa[2][2] = 5
aaa[3][0] = 4 aaa[3][1] = 5 aaa[3][2] = 6
aaa[4][0] = 5 aaa[4][1] = 6 aaa[4][2] = 7
hello...
請按任意鍵繼續. . .
*****
*****
*****
*****
****/
a[i][j] === a[0+i][j] ==> *(a+i)[j] ===> *(a+i)[0 + j] ==> *( *(a+i) + j)
void printarray01(int a[3][5]) //最不好的**
}}void printarray02(int a[5]) //二維陣列是乙個指向一維陣列的指標。所以函式引數不用關心有多少行,只需要給出每一行有多少列確定指標步長即可
}}void printarray03( int (*b)[5]) //直接定義乙個指向int [5]的陣列指標}}
void f(int a[5]) ====》void f(int a); ===》 void f(int* a);
void g(int a[3][3])====》 void g(int a[3]); ====》 void g(int (*a)[3]);
一維陣列 char a[30]====》 指標 char*
指標陣列 char *a[30] ====》指標的指標 char **a
二維陣列 char a[10][30] ====》 陣列的指標 char(*a)[30]
#define _crt_secure_no_warnings
#include
#include
#include
void printfarray01(int *array, int size)
}void main()
}//把二維陣列 當成 1維陣列 來列印 證明線性儲存
printfarray01(*a, 15);
printf("hello...\n");
system("pause");
return;
}
指標陣列示例程式
#include
#include
#include
int searchkeyword(char * table,int count,char *keyword,int
*pos)
for (i = 0; i < count; i++)
}if (i == count)
return ret;
}#define dim(a) (sizeof(a)/sizeof(*a))
void main()
; int
pos;
searchkeyword(src, dim(src), "case", &pos);
printf("case is :%d\n",pos);
searchkeyword(src, dim(src), "break", &pos);
printf("break is :%d\n", pos);
system("pause");
return;
}
指標陣列的自我結束功能
指標陣列最後乙個元素用null或者』\0』或者0結尾可以表示指標陣列結束,實現自我結束功能,而且三者實質一樣
#include
#include
#include
void main()
; char* c_keyword2 = ;
char* c_keyword3 = ;
for (i = 0; c_keyword[i] != null; i++)
printf("\n....\n");
for (i = 0; c_keyword2[i] != null; i++)
printf("\n....\n");
for (i = 0; c_keyword3[i] != null; i++)
//三個執行效果一模一樣
system("pause");
}
c語言陣列
陣列 構造資料型別之一 陣列是具有一定順序關係的若干個變數的集合,組成陣列的各個變數稱為陣列的元素。陣列中各元素的資料型別要求相同,用陣列名和下標確定。陣列可以是一維的,也可以是多維的。在科學計算中,許多重要的應用都是基於陣列的。所謂一維陣列是指只有乙個下標的陣列。它在計算機的記憶體中是連續儲存的。...
C語言陣列
在變數作函式引數時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變後,實參並不變化,兩者的終值是不同的。而當用陣列名作函式引數時,情況則不同。由於實際上形參和實參為同一陣列,因此當形引數組發生變化時,實參陣列也隨之變化。當然這種情況不能理解...
C語言 陣列
陣列 void test1 for int i 0 i 5 i for int i 0 i 5 i 陣列資料倒序存放 void test2 printf 請輸入5個學生的成績 n for int i 4 i 0 i printf 輸出5個學生的成績 n for int i 0 i 5 i 將陣列的長...