陣列就是乙個可以一次性定義多個相同型別的變數,並可以放到乙個連續的記憶體中去。
只有在定義的時候順便賦值才叫初始化。
int a = 1024 ; int arr[5] = ; // 完全初始化
int arr1 = // 正確,定義的時候並沒有確定大小, 初始化後才確定的大小
arr2 = // 不可行, 陣列只有在初始化的時候可以統一賦值
int arr2 [5] = ; // 語法上可以,但是邏輯上不允許, 涉嫌越界
int arr3[50] = ; // 不完全初始化 , 沒有初始化部分自動填充0
陣列名在不同的環境中表示的意思不一樣
a.在定義的時候 int a[10];
b.在sizeof(a)語句中;
c.在取位址&a時。
a.除了上面三種情況以外,其他所有情況都表示首元素的首位址。
儲存方式:一片連續的記憶體空間,按照具體的資料型別進行分割
陣列下標:以陣列首位址為起點的偏移量
//輸出結果,可得相鄰的陣列元素位址相差4,與陣列的型別所佔的大小相等
arr1[1]:0x7fffeec8c1f4
arr1[2]:0x7fffeec8c1f8
arr1[3]:0x7fffeec8c1fc
arr1[4]:0x7fffeec8c200
arr1[5]:0x7fffeec8c204
注意:
1.一位陣列中arr表示首元素的起始位址,&arr表示整個陣列的起始位址,雖然值是一樣的但是代表的意義卻不一樣;
2.arr+1與&arr[1],arr+2與arr&[2].....arr+n與&arr[n]是相同的意思;
3.a[1]與1[a],a[2]與2[a]....a[n]與n[a]是相同的意思。
專門用來存放字元資料的陣列,成為字元陣列。
char s1 [5] = ; // 中存放的是字元資料
char s2 [6] = ; // 中存放的是字串資料
char s3 [6] = ; // s3中存放的是字串 , 注意陣列大小必須能完整儲存下整個字串包括結束符
char s4 [6] = "hello"; // 使用雙引號的時候大括號可以省略
s4[1] = 'e' ;
printf("s1:%s\n" , s1 ); // 注意該陣列為字元陣列,不應該使用%s來訪問輸出,他會涉嫌越界,%s需要遇到'\0'才願意停下來
printf("s2:%s\n" , s2 ); // 常規操作 printf("s2:%s\n" , s2+2 ); s2+2 加了兩個 char 的大小 ,
printf("s3:%s\n" , s3 );
printf("s4:%s\n" , s4 );
二維陣列可以理解為:陣列內容為陣列。
/* 測試** */
int arr[3][3] = ,,};
printf("&arr: %p\n", &arr);
printf("&arr+1:%p\n", &arr+1);
printf("arr[0][0]:%p\n", *arr+0);
printf("arr[0][1]:%p\n", *arr+1);
printf("arr[0][2]:%p\n", *arr+2);
printf("arr[0][0]:%p\n", *(arr+0));
printf("arr[1][0]:%p\n", *(arr+1));
printf("arr[2][0]:%p\n", *(arr+2));
printf("arr[0][1]:%d\n", *(*(arr+0)+0));
printf("arr[0][2]:%d\n", *(*(arr+0)+1));
printf("arr[0][3]:%d\n", *(*(arr+0)+2));
注意:
1.如果將**中的&arr,arr+0,(arr+0)傳遞給相應的指標,其所代表的意義也將傳遞給指標。
長度為零的陣列
int a[0];
其主要的功能是放在結構體的末尾,作為結構的最後乙個成員,可以作為結構體內存擴容入口,陣列是c語言中唯一乙個允許越界訪問的東西。
越界訪問:只是訪問本來不屬於某個變數的記憶體(陣列原本申請大區域)不一定就是非法訪問
越界是訪問的記憶體只要都屬於我當前程式所用的記憶體就不屬於非法訪問。
非法訪問:訪問的記憶體位址不屬於你這個程式的記憶體。
概念: 在定義陣列之前可能他的長度是未知的, 定義語句執行後他的長度是固定的。
重點: 在定於語句中陣列的長度是乙個變數,定義結束之後即使長度的變數有所變化也不會影響陣列的長度了。
說白了就是陣列的長度是乙個變數;
int i = 90 ; 。。。 。。 int buf[ i ] ;
int a = 10 ; int arr[ a ] = ; // error: variable-sized object may not be initialized
注意:
變長陣列不可以初始化。
用來存放指標的陣列
int * arr[5] ;
int a , b ,c ,d, e ;
arr[0] = &a ;
arr[1] = &b ;
char * str [3] = ;
for (int i = 0; i
常量:不可以被修改的量
儲存在常量區的字串資料稱為字串常量,實際上是乙個匿名陣列
printf("%d\n" , sizeof("gz2075")); // "gz2075"表示的整個陣列
printf("%p\n" , &"gz2075"); // "gz2075"表示的整個陣列
printf("%c\n" ,"gz2075"[1]); // 使用與陣列類似的方法來訪問某一位元素
char * p1 = "gz2075" ; // p1指向 "gz2075" 匿名陣列的首元素的首位址
char * p2 = "gz2075" + 1; // p2 指向 "gz2075" 匿名陣列的第二個元素 『z』
注意:
1.字串都是以'\0'結尾的,不可忽略它的存在;
2.注意下面兩個語句的區別:
char *p1 = "hello"; //直接將字串常量的位址給了p1
char p2 = "world"; //將字串常量賦值到p2所在的儲存區中,相當於拷貝了乙份
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 將陣列的長...