c语言数组遇上sizeof和strlen

来源:互联网 发布:c语言 fprintf 编辑:程序博客网 时间:2024/04/27 09:48

数组的一些运算

首先,先来看一个例子:

//一维数组     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(指针变量)    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’结束。参数为字符指针类型。

这里写图片描述

原创粉丝点击