版权声明:此文章为博主原创,未经允许不得转载。
掌握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(数组名) 这里的数组名表示整个数组 计算的是整个数组的大小
&数组名 这里的数组名表示整个数组 取出的是整个数组的地址