数组的相关运算:sizeof和strlen的区别与应用


#数组的相关运算:sizeof和strlen的区别与应用


  1. 数组名单独放在sizeof()内部,数组名表示整个数组,所以sizeof(数组名)计算的是整个数组的大小,单位是字节
  1. &数组名,数组名表示整个数组,所以&数组名取出的是整个数组的地址
  2. 除此之外,所有的数组名都表示首元素的地址

程序代码及运行结果如下:


#include <stdio.h>    
#include <string.h>  
int main()  
{  
    int a[] = {1,2,3,4};//一维数组  
    printf("%d\n", sizeof(a));      //16 表示整个数组的大小  
    printf("%d\n", sizeof(a+0));    //4 表示首元素的地址  
    printf("%d\n", sizeof(*a));     //4 表示首元素的大小  
    printf("%d\n", sizeof(a+1));    //4 表示a[1]的地址  
    printf("%d\n", sizeof(a[1]));   //4 表示a[1]的大小  
    printf("%d\n", sizeof(&a));     //4 表示整个数组的地址  
    printf("%d\n", sizeof(&a+1));   //4 表示跳出这个数组的地址  
    printf("%d\n", sizeof(&a[0]));  //4 表示a[0]的地址  
    printf("%d\n", sizeof(&a[0]+1));//4 表示a[1]的地址 
    
    int a[3][4] = {0};//二维数组  
    printf("%d\n", sizeof(a));        //48 表示二维数组的大小  
    printf("%d\n", sizeof(a[0][0]));  //4 表示首元素的大小  
    printf("%d\n", sizeof(a[0]));     //16 表示第一行的大小  
    printf("%d\n", sizeof(a[0] + 1)); //4 表示a[0][1]的地址  
    printf("%d\n", sizeof(a + 1));    //4 表示第二行a[1][0]的地址  
    printf("%d\n", sizeof(&a[0] + 1));//4 表示a[1][0]的地址  
    printf("%d\n", sizeof(*a));       //16 第一行元素的大小  
    printf("%d\n", sizeof(a[3]));     //16 虽然超出了定义,但还是按类型计算  
  
    char arr[] = "abcdef";//字符数组  
    printf("%d\n", sizeof(arr));        //7 表示数组的大小,有\0  
    printf("%d\n", sizeof(arr + 0));    //4 表示首元素的地址  
    printf("%d\n", sizeof(*arr));       //1 表示首元素的大小  
    printf("%d\n", sizeof(arr[1]));     //1 表示arr[1]的大小  
    printf("%d\n", sizeof(&arr));       //4 表示整个字符串的地址  
    printf("%d\n", sizeof(&arr + 1));   //4 向字符串后面的地址  
    printf("%d\n", sizeof(&arr[0] + 1));//4 表示a[1]的地址 
    //strlen(起始位置)(给一个地址,strlen去找)
    printf("%d\n", strlen(arr));        //6 表示字符串的长度  
    printf("%d\n", strlen(arr+0));      //6 指向a,开始往后找  
    printf("%d\n", strlen(*arr));       //error 从97开始找,给了一个错误的地址  
    printf("%d\n", strlen(arr[1]));     //error 从98开始找,给了一个错误的地址  
    printf("%d\n", strlen(&arr));       //6 表示整个数组的长度,不算\0  
    printf("%d\n", strlen(&arr + 1));   //x  跳出数组,随机值  
    printf("%d\n", strlen(&arr[0] + 1));//5 表示从b开始  
  
    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 表示arr[1]的大小  
    printf("%d\n", sizeof(&arr));       //4 表示整个数组的地址  
    printf("%d\n", sizeof(&arr+1));     //4 表示跳出这个数组的地址  
    printf("%d\n", sizeof(&arr[0]+1));  //4 表示arr[1]的地址  
    //strlen(起始位置)(给一个地址,strlen去找)  
    printf("%d\n", strlen(arr));        //x 表示首元素的地址,但是遇不到\0,随机值   
    printf("%d\n", strlen(arr + 0));    //x 表示首元素的地址,但是遇不到\0,随机值 
    printf("%d\n", strlen(*arr));       //error 从97开始找,给了一个错误的地址  
    printf("%d\n", strlen(arr[1]));     //error 从98开始找,给了一个错误的地址  
    printf("%d\n", strlen(&arr));       //x 表示这整个数组的地址,但是遇不到\0,随机值  
    printf("%d\n", strlen(&arr + 1));   //x 表示跳出这个数组的地址,随机值  
    printf("%d\n", strlen(&arr[0] + 1));//x 表示arr[1]的地址,但是遇不到\0,随机值  
    
    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 向字符串后面的地址  
    printf("%d\n", sizeof(&p[0]+1));  //4 表示第二个字符的地址
    //strlen(起始位置)(给一个地址,strlen去找)  
    printf("%d\n", strlen(p));        //6 表示字符串的长度  
    printf("%d\n", strlen(p+1));      //5 指向b  
    printf("%d\n", strlen(*p));       //error 从97开始找,给了一个错误的地址  
    printf("%d\n", strlen(p[0]));     //error 从98开始找,给了一个错误的地址  
    printf("%d\n", strlen(&p));       //x 从p的地址开始,找不到对应的字符,随机值   
    printf("%d\n", strlen(&p + 1));   //x 跳出地址,从地址之外开始,随机值   
    printf("%d\n", strlen(&p[0] + 1));//5从第二个字符开始    
    return 0;  
}  

注:

  1. 注释为程序在32bit平台下运行的结果
  2. x表示随机值,error表示该语句错误

如有错误,烦请私信以便及时修改,万分感谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值