sizeof()与strlen()表示元素大小的辨析

数组名的首元素的地址


1.sizeof(数组名) 表示整个数组
2.&数组名 表示数组名整个数组
3.地址分32位与64位差别,而数值不用

用sizeof()表达

int[]类型数组


#include <stdio.h>
int main()
{
    int a[] = {1,2,3,4};//实际存放 'a''b''c''d''e''f'
    printf("%d\n", sizeof(a)); //16字节 , 4个元素 * 4字节
    printf("%d\n", sizeof(a + 0));//4(32位) 或 8(64位) 字节 , 代表首元素的地址
    printf("%d\n", sizeof(*a));//4字节 , 表示首元素地址的数值的字节大小
    printf("%d\n", sizeof(a + 1));//4(32位) 或 8(64位) 字节, 代表第二元素的地址
    printf("%d\n", sizeof(a[1]));//4字节 , 代表第二元素的大小
    printf("%d\n", sizeof(&a)); //4(32位) 或 8(64位) 字节 , &a代表是数组的地址,但还是地址,大小是4个字节
    printf("%d\n", sizeof(*&a));//16字节 , &a是数组的地址,数组的地址解引用,访问的是数组,sizeof()计算的数组大小,单位字节
    printf("%d\n", sizeof(&a + 1));//4(32位) 或 8(64位) 字节 , &a是整个数组的地址,+1后,是跳过了整个数组,但还是一个地址
    printf("%d\n", sizeof(&a[0]));//4(32位) 或 8(64位) 字节 , 先于[]结合,即取第一个元素,后结合&,即取第一个个元素的地址
    printf("%d\n", sizeof(&a[0] + 1));//4(32位) 或 8(64位) 字节 ,  先于[]结合,即取第一个元素,后结合&,即取第一个个元素的地址,在+1即取第二个元素的地址
}

char[]类型的一维数组

#include<stdio.h>
#include <string.h>

int main()
{
    
    char arr[] = {'a','b','c','d','e','f'};//实际存放 'a''b''c''d''e''f'
    printf("%d\n", sizeof(arr)); // 6字节 , 6元素 * 1字节
    printf("%d\n", sizeof(arr + 0));// 4(32位) 或 8(64位) 字节 , arr是首元素地址,arr+0还是首元素地址,地址就是4/8字节
    printf("%d\n", sizeof(*arr));// 1字节 , arr为首地址,解引用得首元素地址内容,char类型占1个字节
    printf("%d\n", sizeof(arr[1]));// 1字节 , 取数组的第一元素内容
    printf("%d\n", sizeof(&arr));//  4(32位) 或 8(64位) 字节 , arr是整个数组地址,求地址大小,那就是4/8字节
    printf("%d\n", sizeof(&arr + 1)); // 4(32位) 或 8(64位) 字节 , 跳过arr整个数组地址,求地址大小,那就是4/8字节
    printf("%d\n", sizeof(&arr[0] + 1));// 4(32位) 或 8(64位) 字节 , 取数组的第一元素内容的地址,+1,取第二个元素地址,求地址大小,那就是4/8字节
}

用strlen()函数表达

#include <stdio.h>
#include <string.h>

int main()
{
    //strlen()函数,当遇到'\0'时,停止查找,返回元素个数
    char arr[] = {'a','b','c','d','e','f'};//实际存放 'a''b''c''d''e''f'
    printf("%d\n", strlen(arr));// 随机值 , 因为arr[]数组中并未由'\0'元素,所以不确定,即为随机值
    printf("%d\n", strlen(arr + 0));// 随机值 , 从第二个地址开始向后查找元素个数,知道找到'\0'停止,即为随机值
    //printf("%d\n", strlen(*arr));// err , 取地址arr,后解引用取到'a'即97,向后访问地址,非法访问地址,程序运行崩溃
    //printf("%d\n", strlen(arr[1]));// err , 取地址'b',向后访问地址,非法访问地址,程序运行崩溃
    printf("%d\n", strlen(&arr));// 随机值 ,  因为arr[]数组中并未由'\0'元素,所以不确定,即为随机值
    printf("%d\n", strlen(&arr + 1));// 随机值 , 与 strlen(&arr) 差一个数组地址的地址,即6个地址
    printf("%d\n", strlen(&arr[0] + 1));// 随机值 , arr[0]为第一个元素,&arr[0]为第一个元素地址,+1后,与 strlen(&arr) 差一个地址
}

 sizeof与strlen函数针对计算不同形式存储数组的元素大小


#include <stdio.h>
#include <string.h>

int main()
{
    char arr[] = "abcdef";
    //arr实际上存放的 'a''b''c''d''e''f''\0'

    //sizeof()函数
    printf("%d\n", sizeof(arr)); // 7字节 , 7元素(包括'\0') * 1字节
    printf("%d\n", sizeof(arr + 0));// 4(32位) 或 8(64位) 字节 , arr是首元素地址,arr+0还是首元素地址,地址就是4/8字节
    printf("%d\n", sizeof(*arr));// 1字节 , arr为首地址,解引用得首元素地址内容,char类型占1个字节
    printf("%d\n", sizeof(arr[1]));// 1字节 , 取数组的第一元素内容
    printf("%d\n", sizeof(&arr));//  4(32位) 或 8(64位) 字节 , arr是整个数组地址,求地址大小,那就是4/8字节
    printf("%d\n", sizeof(&arr + 1)); // 4(32位) 或 8(64位) 字节 ,arr是整个数组地址,+1,跳过arr整个数组地址,求地址大小,那就是4/8字节
    printf("%d\n", sizeof(&arr[0] + 1));// 4(32位) 或 8(64位) 字节 , 取数组的第一元素内容的地址,+1,取第二个元素地址,求地址大小,那就是4/8字节

    //strlen()函数
    printf("%d\n", strlen(arr));// 6字节 , 6元素(不包括'\0') * 1字节 , 因为arr[]数组中有'\0'元素,所以遇到'\0'查找停止
    printf("%d\n", strlen(arr + 0));// 6字节 , arr代表首元素地址,+0,还是首元素地址,因为arr[]数组中有'\0'元素,所以遇到'\0'查找停止
    //printf("%d\n", strlen(*arr));// err , 取地址arr,后解引用取到'a'即97,向后访问地址,非法访问地址,程序运行崩溃
    //printf("%d\n", strlen(arr[1]));// err , 取地址'b'即98,向后访问地址,非法访问地址,程序运行崩溃
    printf("%d\n", strlen(&arr));// 6字节 , arr是整个数组的地址,&arr是数组的地址
    printf("%d\n", strlen(&arr + 1));// 随机值 ,arr是整个数组的地址,+1后,跳过整个数组,但不确定什么时候能遇到'\0',所以为随机值
    printf("%d\n", strlen(&arr[0] + 1));// 5字节 , arr[0]为第一个元素,&arr[0]为第一个元素地址,+1后,即从'b'向后累加值


    char* p = "abcdef";
    //这个*p 指向'a'的地址
    printf("%d\n", sizeof(p));// 4(32位) 或 8(64位) 字节 , 得到字符'a'的地址,即计算指针变量p的大小
    printf("%d\n",sizeof(p + 1));// 4(32位) 或 8(64位) 字节 ,得到字符'b'的地址,即计算指针变量p的大小
    printf("%d\n",sizeof(*p));// 1字节 , p为首元素指针,*p解引用,得到'a',占一个字节
    printf("%d\n",sizeof(p[0]));// 1字节 , 类似{int arr[10]; arr[0] == *(arr+0);} 即p[0] == *(p+0) == 'a'一个字节
    printf("%d\n",sizeof(&p));// 4(32位) 或 8(64位) 字节 , 取出 p 的地址
    printf("%d\n",sizeof(&p+1));// 4(32位) 或 8(64位) 字节 , 取出 p 的地址 ,后+1,取得是跳过p的地址,还是地址
    printf("%d\n",sizeof(&p[0]+1));// 4(32位) 或 8(64位) 字节 , 取出 p[0]的内容,后取地址 ,后+1,取得是'b'的地址,还是地址
     //strlen()函数
     printf("%d\n", strlen(p));// 6字节 , 6元素(不包括'\0') * 1字节 , 因为arr[]数组中有'\0'元素,所以遇到'\0'查找停止
     printf("%d\n", strlen(p + 1));// 5字节 , 指针指向'b',从'b'开始往后计算遇到'\0'查找停止
     //printf("%d\n", strlen(*p));// err , 相当于遇到p的地址进行解引用,为'a'的地址,即97,向后查询,遇到'\0'查找停止
     //printf("%d\n", strlen(p[0]));// err , 相当于遇到p的地址进行解引用,为'a'的地址,即97,向后查询,遇到'\0'查找停止
     printf("%d\n", strlen(&p));//随机值 取地址取得是p的地址并不是p指向字符串的地址
     printf("%d\n", strlen(&p + 1));//随机值 取地址取得是p的地址并不是p指向字符串的地址
     printf("%d\n", strlen(&p[0] + 1));// 5字节 p[0]是取到数组第一个元素,&p[0]取到第一个元素地址,+1,取到第二个元素地址,遇到'\0'查找停止
    return  0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值