c语言数组遇上sizeof和strlen
2017-11-26 11:39
302 查看
数组的一些运算
首先,先来看一个例子://一维数组 int a[] = {1,2,3,4}; printf("%d\n",sizeof(a));//16(表示数组大小) printf("%d\n",sizeof(a+0));//4(a[0]地址) printf("%d\n",sizeof(*a));//4(对地址解引用,表示首元素) printf("%d\n",sizeof(a+1));//4(a[1]a的地址) printf("%d\n",sizeof(a[1]));//4(a[1]元素) printf("%d\n",sizeof(&a));//4(数组的地址)(还是地址就是4) printf("%d\n",sizeof(&a+1));//4(跳过该数组的下一个数组的地址)(即4后面的地址) printf("%d\n",sizeof(&a[0]));//4(a[0]的地址) printf("%d\n",sizeof(&a[0]+1)); //a[1]的地址
我们都知道sizeof的用法,但她在计算数组时有一些需要注意的地方,在此总结:
1,sizeof内部单独存放数组名,此时表示整个数组
2,&(数组名),此时表示整个数组
除此之外:数组名都表示首元素的地址
牢记这个规则去思考下面的题都是可以解决的 :
//字符数组 char arr[] = {'a','b','c','d','e','f'}; printf("%d\n", sizeof(arr));//6(整个数组的大小) printf("%d\n", sizeof(arr+0));//4(首元素的地址) printf("%d\n", sizeof(*arr));//1(首元素字符) printf("%d\n", sizeof(arr[1]));//1(第二个元素字符) printf("%d\n", sizeof(&arr));//4(数组的地址) printf("%d\n", sizeof(&arr+1));//4(数组的地址,指向f后面) printf("%d\n", sizeof(&arr[0]+1)); //4(第二个元素的地址) char arr[] = "abcdef"; printf("%d\n", sizeof(arr));//7(整个数组的大小) printf("%d\n", sizeof(arr + 0));//4(首元素的地址) printf("%d\n", sizeof(*arr));//1(首元素字符) printf("%d\n", sizeof(arr[1]));//1(第二个元素字符) printf("%d\n", sizeof(&arr));//4(数组的地址) printf("%d\n", sizeof(&arr + 1));//4(数组的地址,指向f后面) printf("%d\n", sizeof(&arr[0] + 1));//4(第二个元素的地址) char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; printf("%d\n", strlen(arr));//随机值 printf("%d\n", strlen(arr + 0));//随机值 printf("%d\n", strlen(*arr));//ERR:strlen将97当作地址,不允许访问该空间 printf("%d\n", strlen(arr[1]));//ERR:strlen将98当作地址,不允许访问该空间 printf("%d\n", strlen(&arr));//随机值(从a开始) printf("%d\n", strlen(&arr + 1));//随机值(从f后开始数) printf("%d\n", strlen(&arr[0] + 1));//随机值(从b开始) char arr[] = "abcdef"; printf("%d\n", strlen(arr));//6 printf("%d\n", strlen(arr + 0));//6(第一个元素开始数起) printf("%d\n", strlen(*arr));//ERR:strlen将97当作地址,不允许访问该空间 printf("%d\n", strlen(arr[1]));//ERR:strlen将98当作地址,不允许访问该空间 printf("%d\n", strlen(&arr));//6 printf("%d\n", strlen(&arr + 1));//随机值(跳过整个数组) printf("%d\n", strlen(&arr[0] + 1));//5(从b开始) char *p = "abcdef"; printf("%d\n", sizeof(p));//4 bcaa (指针变量) printf("%d\n", sizeof(p + 1));//4(地址) printf("%d\n", sizeof(*p));//1(访问一个字符) printf("%d\n", sizeof(p[0]));//1(第一个元素字符) printf("%d\n", sizeof(&p));//4(指针的地址) printf("%d\n", sizeof(&p + 1));//4(p地址的下一个地址) printf("%d\n", sizeof(&p[0] + 1));//4(b的地址) printf("%d\n", strlen(p));//6 printf("%d\n", strlen(p + 1));//5 printf("%d\n", strlen(*p));//ERR:strlen(97)不允许访问 printf("%d\n", strlen(p[0]));//ERR printf("%d\n", strlen(&p));//随机值(p的地址向后找) printf("%d\n", strlen(&p + 1));//随机值(跳过p的地址向后找) printf("%d\n", strlen(&p[0] + 1));//5(b的地址向后找)
在这里,区分一下sizeof和strlen
sizeof:运算符。功能:获得保证能容纳实现所建立的最大对象的字节大小。
sizeof后面如果是类型必须加(),变量名可以不加。(建议:最好都加)
strlen:函数。
功能:返回字符串的长度。从字符串第一个地址开始遍历,直到遇到结束标志‘\0’结束。参数为字符指针类型。
相关文章推荐
- c语言中的数组sizeof和strlen
- [c语言]sizeof() 居然不是函数?!!strlen()和sizeof()纠缠在一起再碰到不同类型的数组,你还能分辨清吗?
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- 【c语言】strlen与sizeof对数组和指针的求法
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- c语言之数组 sizeof strlen
- c语言006-sizeof/strlen的使用和区别
- sizeof与strlen使用,字符串指针数组
- C语言strlen函数和sizeof操作符
- 关于字符串、数组的strlen()和sizeof()
- 指针的相关运算,包括一维数组、二维数组、字符数组的sizeof、strlen运算
- C语言学习5:数组定义,数组名的含义,数组作为函数参数,数组赋值,数组左右移动,最大最小,反向遍历,冒泡排序,sizeof 和strlen区别,gets和puts,strcpy,strcat,strcmp,strchr,strstr,strlen
- C语言中strlen与sizeof的区别
- 数组与字符串长度sizeof()、strlen()、string的length()和size()
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- C语言 第 5 节 sizeof() 与 strlen() 的区别
- sizeof 和 strlen的一些区别(用C语言代码表示)
- 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法
- C语言-Sizeof与Strlen的区别与联系(转)
- C语言学习之sizeof和strlen对比