C语言:数组的运算及sizeof(),strlen()操作符的介绍

sizeof()运算符

sizeof是c语言内置运算符,以字节为单位给出指定类型的大小,其作用就是返回一个对象或者类型所占的内存字节数。
用法:
1.用于数据类型 如:sizeof(Type)
这里写图片描述
运行结果如下:
这里写图片描述

2.用于变量 sizeof(var_name)

注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

strlen()函数

原型:unsigned int strlen(const char *s)
头文件:string.h
Get the length of a string, using the current locale or a specified locale.
计算字符串s的(unsigned int型)长度,不包括’\0’在内.返回s的长度,不包括结束符NULL。

两者区别:
⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是取字节运算符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
⒋数组做sizeof的参数不退化,传递给strlen就退化为指针了。
⒌大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因
char str[20]=”0123456789”;
long a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
⒏当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
⒐数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。

数组的运算

 int a[] = {67, 9, 54};  

    printf("%p\n", a);         //输出数组a的地址,即数组首元素的地址 
    printf("%p\n", &a);       //输出数组a的地址,即数组首元素的地址
    printf("%d\n",sizeof(a+0));      //4  数组的首元素地址  
    printf("%d\n",sizeof(&a[0]));    //4  数组a首个元素的地址 
    printf("%d\n",sizeof(&a));       //4  数组a首元素的地址 


    printf("%d\n", sizeof(*a));      //4  计算数组a第一个元素的大小  
    printf("%d\n",sizeof(*a));       //4  首元素所占空间大小,一个整型的大小 


    printf("%d\n",sizeof(a+1));     //4  数组第二个元素所占大小  
    printf("%d\n",sizeof(a[1]));    //4  数组第二个元素所占大小  



    printf("%d\n", sizeof(*&a));    //20 整个数组的大小  
    printf("%d\n",sizeof(a));       //20  整个数组的大小  
    printf("%d\n",sizeof(*&a));     //20  整个数组的大小



    printf("%p\n", a+1);         //数组下一个元素的地址。
    printf("%d\n",sizeof(&a+1));//4  数组a第二个元素的地址  


    printf("%d\n",sizeof(&a[0]+1));//4 数组a第一个元素的地址+1,还是地址  


    printf("%p\n", &a+1);  //输出跳过整个数组a之后的地址
char arr[] = "abcdef";
        printf("%d\n", sizeof(arr));//7 整个字符串大小 多了\0
        printf("%d\n", sizeof(arr+0));// 4第一个元素a的地址大小
        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));// 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
        printf("%d\n", sizeof(&arr[0]+1));// 4第二个元素b地址的大小
char arr[] = "abcdef";
        printf("%d\n", strlen(arr));    // 6 整个字符串长度不包括\0
        printf("%d\n", strlen(arr+0));  // 6 整个字符串长的
        printf("%d\n", strlen(*arr));   // err 崩溃
        printf("%d\n", strlen(arr[1])); //err 崩溃
        printf("%d\n", strlen(&arr));   // 6 字符串长度
        printf("%d\n", strlen(&arr+1)); //x 随机值偏移了整个数组大小 不知何时遇到\0停止
        printf("%d\n", strlen(&arr[0]+1)); // 5 第二个元素开始字符串长度
 char *p = "abcdef";
    printf("%d\n", strlen(p));//6  p相当于arr,代表首元素地址  
    printf("%d\n", strlen(p+1));//5  第二个元素开始  
    printf("%d\n", strlen(*p));//err  把a的ascii值当做地址查找无法访问,出错  
    printf("%d\n", strlen(p[0]));//err  把a的ascii值当做地址查找无法访问,出错  
    printf("%d\n", strlen(&p));//X 从a当中的地址开始查字符,不知道是否为0停止  
    printf("%d\n", strlen(&p+1));//  从b当中的地址开始查,不知道是否为0停止  
    printf("%d\n", strlen(&p[0]+1));//5 从第二个元素开始查找字符,知道'\0'停止  


    printf("%d\n", sizeof(p));//4 整个字符串地址大小
    printf("%d\n", sizeof(p+1));//4 第二个元素地址的大小
    printf("%d\n", sizeof(*p));//1 第一个元素a大小
    printf("%d\n", sizeof(p[0]));//1第一个元素a大小
    printf("%d\n", sizeof(&p));//4 第一个元素地址的大小
    printf("%d\n", sizeof(&p+1));//4 整个字符串之后下一个空间的地址,+1是偏移了一个字符串的大小即f之后,但它仍是个指针,指针的大小永远为4
    printf("%d\n", sizeof(&p[0]+1));//4 第二个元素大小 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值