讓初學者自閉的程式碼(不來試試嗎)
阿新 • • 發佈:2018-12-19
版權宣告:此文章為博主原創,未經允許不得轉載。
掌握sizeof()和strlen()的用法,以下程式碼(均為求陣列和字串長度)僅作為筆試經典題目,不建議程式碼中應用。
int a[] = { 1,2,3,4 }; sizeof(a) //16 整個陣列的長度 sizeof(a+0) //4 此處a隱式轉換為指標 sizeof(*a) //4 a表示首元素 sizeof(a+1) //4 首元素+1 sizeof(a[1]) //4 sizeof(&a) //4 陣列指標 sizeof(*&a) //16 對這個指標解引用 得到的仍然是原來的陣列 sizeof(&a+1) //4 指標加1 sizeof(&a[0]) //4 []優先順序高 取第0個元素得地址 sizeof(&a[0]+1) //4 //c風格字串 才是以 \0 結束的 char a[] = { 'a','b','c','d','e','f' }; sizeof(arr) //6 sizeof(a+0) //4 地址長度 sizeof(*arr) //1 arr被隱式轉換成指標 sizeof(arr[1]) //1 sizeof(&arr) //4 sizeof(&arr+1) //4 sizeof(&arr[0]-1) //4 //strlen()求字串長度的原理為尋找\0 char a[] = { 'a','b','c','d','e','f' }; strlen(arr) //隨機值 找不到\0 strlen(arr+0) //隨機值 strlen(*arr) //error *arr取到得是第一個字元 此時不應該進行strlen 操作 strlen(arr[1]) //error strlen(&arr) //隨機值 strlen(&arr[1]) //隨機值 strlen(&arr[0]+1) //隨機值 char arr[] = "abcdef";//這種風格初始化只限於字元陣列 這時候包含了\0 sizeof(arr) //7 sizeof(arr+0) //4 sizeof(*arr) //1 sizeof(arr[1]) //1 sizeof(&arr) //4 sizeof(&arr+1) //4 sizeof(&arr[0]+1) //4 char arr[] = "abcdef"; //strlen在求長度的時候不會計入\0 strlen(*arr) //error strlen(&arr) //6 strlen(&arr+1) //隨機值 &arr是一個數組指標 strlen(&arr[0]+1) //5 strlen(a0rr+0) //6 char* p = "abcdef"; sizeof(p) //4 這時一個指標 sizeof(p+1) //4 sizeof(*p) //1 指向首元素 sizeof(p[0]) //1 sizeof(&p) //4 sizeof(&p+1) //4 sizeof(&p[0]+1) //4 ""包含的字串就是c風格字串 strlen(p) //6 strlen(p+1) //5 只跳過一個元素 strlen(*p) //error strlen(p[0]) //error strlen(&p) //隨機值 二級指標 strlen(&p+1) //隨機值 strlen(&p[0]+1) //5 int a[3][4] = { 0 }; sizeof(a) //48 sizeof(a[0][0]) //4 sizeof(a[0]) //16 第一行 sizeof(a[0]+1) //4 只要進行數學運算 就成了指標 sizeof(*(a[0]+1)) //4 a[0][1]-->a[0]+1 意義是一樣的 sizeof(a+1) //4 指標 sizeof(*(a+1)) //16 a[1] sizeof(&a[0]+1) //4 sizeof(*a) //16 a[0] sizeof(a[3]) //16
總結 sizeof(陣列名) 這裡的陣列名錶示整個陣列 計算的是整個陣列的大小 &陣列名 這裡的陣列名錶示整個陣列 取出的是整個陣列的地址