让初学者自闭的代码(不来试试吗)

版权声明:此文章为博主原创,未经允许不得转载。

掌握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(数组名) 这里的数组名表示整个数组 计算的是整个数组的大小
&数组名 这里的数组名表示整个数组 取出的是整个数组的地址

你可能感兴趣的:(学习笔记,个人总结,经典题目)