c語言陣列、sizeof()及strlen()

qq_38307034發表於2017-04-15
一、陣列
  1、int arr[10]={0};中 arr為該陣列的陣列名,10為陣列所佔空間,{}中為陣列內容,int[10]表示陣列型別。
  2、陣列定義時若是初始化,則arr後必須註明次陣列需用多少空間,{0}表示將陣列中第一個元素初始化為零,其餘元素預設為0。
  3、陣列沒定義大小時必須在後邊註明內容。
  4、[]中必為常量,不可為變數。
  5、int arr1[10]={0}為整形陣列,char arr3[]={'a','b','c'}為字元陣列。
  6、陣列大小計算sz=sizeof(arr)/sizeof(arr[0])。
二、指標
  1、指標是一個用來存放地址的變數。
  2、對於一維陣列,除了sizeof(arr)\&arr外,其餘的都代表陣列首元素的地址。
  3、獲得陣列中每個元素的地址:陣列名+整數(首元素地址+整數);&arr[i]
三、sizeof
       //整形陣列
printf("%p\n", &a);
printf("%p\n", &a+1);
printf("%d\n", sizeof(*&a));
//&a表示整個陣列的地址,加上*表示整個陣列,這是一個包含四個元素的整型陣列,所以佔16個位元組。


printf("%d\n",sizeof(a));//16
//陣列名單獨放到sizeof中時代表整個陣列,因此sizeof(a)代表整個陣列所佔的記憶體,而這個陣列a是一個整型陣列每個元素佔四個位元組,四個元素總共佔16個位元組。
printf("%d\n",sizeof(a+0));//4
//陣列名非單獨放到sizeof中使用時代表陣列首元素地址,因此sizeof(a+0)代表陣列a中首 元素地址所佔的記憶體,一個地址佔四個位元組。
printf("%d\n",sizeof(*a));//4
//同上,a代表首元素地址,而*a代表首元素,整型陣列一個元素佔四個位元組,所以sizeof(*a)佔四個位元組。
printf("%d\n",sizeof(a+1));//4
//a在sizeof中非單獨使用,代表首元素地址,a+1代表第二個元素的地址,所以也佔四個位元組。
printf("%d\n",sizeof(a[1]));//4
//a[1]代表陣列中第二個元素,整型陣列每個元素佔四個位元組。
printf("%d\n",sizeof(&a));//4
//a單獨出現在&後邊時代表整個陣列,&a就代表著整個陣列的地址,因為是地址,所以佔四個位元組。
printf("%d\n",sizeof(*&a));//16
//上述,a單獨出現在&後面時,代表整個陣列,&a表示整個陣列的地址,加上*代表整個陣列,即*&a代表整個陣列所有的元素,佔16位元組。
printf("%d\n",sizeof(&a+1));//4
//&a代表整個陣列的地址,之後加1,程式設計整個陣列後面的地址,因為是地址,佔四個位元組。
printf("%d\n",sizeof(&a[0]));//4
//a[0]陣列中第一個元素,取地址佔四個位元組。
printf("%d\n",sizeof(&a[0]+1));//4
//a[0]+1陣列中第二個元素,取地址,佔四個位元組。

//字元陣列
char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};
printf(“%d\n”, sizeof(arr));//6
//陣列名單獨存在於sizeof後面代表整個陣列,因為是字元陣列,陣列中每個元素佔一個位元組,所以6各元素總共佔6個位元組。
printf(“%d\n”, sizeof(arr+0));//4
//陣列名非單獨作用於sizeof後,代表陣列首元素地址,首元素地址加上0還是首元素地址,佔四個位元組。
printf(“%d\n”, sizeof(*arr));//1
//同理 arr代表首元素地址,*arr代表首元素,因為是字元陣列,一個元素佔一個位元組。
printf(“%d\n”, sizeof(arr[1]));//1
//arr[1]表示陣列第二個元素,字元陣列一個元素佔一個位元組。
printf(“%d\n”, sizeof(&arr));//4
// &arr 代表整個陣列的地址,佔四個位元組。
printf(“%d\n”, sizeof(&arr+1));//4
// &arr+1代表整個陣列後面相連的地址,佔四個位元組。
printf(“%d\n”, sizeof(&arr[0]+1));//4
//&arr[0]陣列首元素的地址,加上1後表示陣列第二個元素的地址,佔四個位元組。

char arr[] = “abcdef”;//[a b c d e f \0]
printf(“%d\n”, sizeof(arr));//7
//當使用一個字串來給一個字元陣列初始化時,系統會預設給字串後面加上\0,也就是說這個字元陣列中的元素,會比看到的abcdef元素多一個元素,所以陣列中是有7個元素的,字元陣列每個元素佔一個位元組,所以整個陣列佔7個位元組。
printf(“%d\n”, sizeof(arr+0));//4
// 陣列名非單獨作用於sizeof函式後,僅作陣列首元素的地址,加上0還是首元素地址,地址佔4個位元組。
printf(“%d\n”, sizeof(*arr));//1
//*arr 作為整個字元陣列的首元素,佔1個位元組。
printf(“%d\n”, sizeof(arr[1]));//1
// arr[1]字元陣列的第二個元素,佔1個位元組。
printf(“%d\n”, sizeof(&arr));//4
// 整個字元陣列的地址,佔4個位元組。
printf(“%d\n”, sizeof(&arr+1));//4
// &arr+1,表示整個字元陣列後面相連的那個地址,地址佔1個位元組。
printf(“%d\n”, sizeof(&arr[0]+1));//4
//字元陣列首元素地址加1,也就是陣列的第二個元素的地址,佔1個位元組。

//strlen 求一個字串的長度,當作用於一個字元陣列時,即從這個字元陣列的首元素地址開始向後檢查,每遇到一個字元則加1,直到遇到\0,或者NULL時停止,不然會生成隨機數。
printf("%d\n", strlen(arr));//x
//x表示隨機數,因為陣列中沒有‘\0’和NULL,所以函式strlen會一直向後面的地址檢索,會生成隨機數。
printf("%d\n", strlen(arr+0));//x
// 原因同上述
printf("%d\n", strlen(*arr));//err
//err 錯誤,程式崩潰,因為*arr表示字元陣列的首元素字元a,a的ascii碼會被當做地址賦給strlen函式,函式在讀取時會發生錯誤。而致使程式崩潰。
printf("%d\n", strlen(arr[1]));//err
//  原因同上,arr[1]是字元陣列的首元素。
printf("%d\n", strlen(&arr));//x
//  因為strlen函式執行時,無法檢索到\0和NULL,所以會生成隨機數。
printf("%d\n", strlen(&arr+1));//x
//原因同上
printf("%d\n", strlen(&arr[0]+1));//x
//原因同上


相關文章