1. 程式人生 > >讓初學者自閉的程式碼(不來試試嗎)

讓初學者自閉的程式碼(不來試試嗎)

版權宣告:此文章為博主原創,未經允許不得轉載。

掌握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(陣列名) 這裡的陣列名錶示整個陣列 計算的是整個陣列的大小 &陣列名 這裡的陣列名錶示整個陣列 取出的是整個陣列的地址