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

2021-07-30 14:31:28 字數 3618 閱讀 3110

一、陣列

1、int arr[10]=;中

arr為該陣列的陣列名,10為陣列所佔空間,{}中為陣列內容,int[10]表示陣列型別。

2、陣列定義時若是初始化,則arr後必須註明次數組需用多少空間,表示將陣列中第乙個元素初始化為零,其餘元素預設為0。

3、陣列沒定義大小時必須在後邊註明內容。

4、中必為常量,不可為變數。

5、int arr1[10]=為整形陣列,char arr3=為字元陣列。

6、陣列大小計算sz=sizeof(arr)/sizeof(arr[0])。

二、指標

1、指標是乙個用來存放位址的變數。

2、對於一維陣列,除了sizeof(arr)\&arr外,其餘的都代表陣列首元素的位址。

三、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 = ;

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

//原因同上

c語言中陣列與sizeof

我以前的理解是 陣列名字就是指向陣列首元素的指標,然而用sizeof 運算元組名字,把我又弄得有些疑惑了。查了查資料,終於明白了。原來,陣列名字做形參時才被當作指標。而sizeof 並不是乙個函式,而是乙個單目運算子,所以sizeof 裡寫陣列名字,返回的就是陣列佔了多少位元組。例如 char a ...

sizeof 二維陣列 C語言陣列

陣列的建立 在建立陣列時,我們必須定義陣列的型別和大小,陣列的大小不能為0,陣列中的元素型別都是相同的。int arr 10 int arr1 3 int arr2 在這裡,我們arr 3 裡邊的數字可以不用寫 int arr3 3 也是可以的,只是把最後乙個數初始化為0了而已int arr4 3 ...

嵌入式C語言陣列,str函式實現

陣列中所有的資料都是相同的資料型別 int a 10 陣列中的元素的首位址都是連續的 a 0 0x0000 a 1 0x0004 位數跟資料型別有關 c語言不允許使用變數的值進行動態定義,賦初值的方式 在定義時賦值 迴圈賦值 陣列與指標的聯絡 陣列的名字是可以當成指標使用的 a 陣列首元素的位址 陣...