陣列的基本概念
陣列就是一個可以一次性定義多個相同型別的變數,并可以放到一個連續的記憶體中去,

初始化
只有在定義的時候順便賦值才叫初始化,
int a = 1024 ; int arr[5] = {1,2,3,4,5}; // 完全初始化
int arr1[] = {1,2,3,4,5,6,7,8,9,10} // 正確,定義的時候并沒有確定大小, 初始化后才確定的大小
arr2 = {1,2,3,4,5,}// 不可行, 陣列只有在初始化的時候可以統一賦值
int arr2 [5] = {1,2,3,4,5,6,7}; // 語法上可以,但是邏輯上不允許, 涉嫌越界
int arr3[50] = {1,2,3,4,5}; // 不完全初始化 , 沒有初始化部分自動填充0
陣列名字的含義
陣列名在不同的環境中表示的意思不一樣
表示整個陣列
?a.在定義的時候 int a[10];
?b.在sizeof(a)陳述句中;
?c.在取地址&a時,
表示陣列首元素的首地址
?a.除了上面三種情況以外,其他所有情況都表示首元素的首地址,
陣列元素參考
存盤方式:一片連續的記憶體空間,按照具體的資料型別進行分割
陣列下標:以陣列首地址為起點的偏移量

int arr1[5] = {1, 2, 3, 4, 5};
printf("arr1[1]:%p\n", &arr1[1]);
printf("arr1[2]:%p\n", &arr1[2]);
printf("arr1[3]:%p\n", &arr1[3]);
printf("arr1[4]:%p\n", &arr1[4]);
printf("arr1[5]:%p\n", &arr1[5]);
//輸出結果,可得相鄰的陣列元素地址相差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] = {'a' ,'b' , 'c' ,'d' , 'e'}; // 中存放的是字符資料
char s2 [6] = {'a' ,'b' , 'c' ,'d' , 'e' , '\0'}; // 中存放的是字串資料
char s3 [6] = {"hello"} ; // 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] = {{1, 11, 111} ,
{2, 22, 222} ,
{3, 33, 333}};
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 ] = {0} ; // 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] = {"Hello" , "GZ2075" , "eVEN"};
for (int i = 0; i < 3; i++)
{
printf("str[%d]:%s\n" , i , str[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’
注意:
字串常量都是以'\0'結尾的,不可忽略它的存在,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/228688.html
標籤:C
