关于sizeof 和strlen 的计算的知识总结

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<assert.h>


int main()
{
    int a[3][4] = { 0 };

    printf("%d\n", sizeof(a));// a单独放在sizeof内部 代表整个数组  48
    printf("%d\n", sizeof(a[0][0])); //代表首元素的地址   4
    printf("%d\n", sizeof(a[0])); //表示第一行    16
    printf("%d\n", sizeof(a[0] + 1));// 表示第一行 第二个元素   4
    printf("%d\n", sizeof(a + 1)); //第一行第二个元素 4
    printf("%d\n", sizeof(&a[0] + 1)); // 第二行   4
    printf("%d\n", sizeof(*a));//16 表示第一行的元素   
    printf("%d\n", sizeof(a[3]));//16 数组后面一行空间

    int num = 10; 
    char *pc = (char *)&num;   
    int *pi = &num;

    printf("%p\n", &num);  //;num的地址
    printf("%p\n", pc);    //num 的地址
    printf("%p\n", pc + 1);  //num的地址往后走一个字节
    printf("%p\n", pi);  //num 的地址
    printf("%p\n", pi + 1);   //num的地址往后走四个字节
    printf("\n");

    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));//指向p数组后面的空间的地址   4
    printf("%d\n", sizeof(&p[0] + 1));//第二个元素的地址  4

    printf("%d\n", strlen(p));//   6
    printf("%d\n", strlen(p + 1));//从第二个元素开始向后找  5
    printf("%d\n", strlen(*p));//err 参数为指针 
    printf("%d\n", strlen(p[0]));//err
    printf("%d\n", strlen(&p));//x 整个数组的地址 但是不知道/0在哪  x
    printf("%d\n", strlen(&p + 1));//指向p后面空间的地址    x
    printf("%d\n", strlen(&p[0] + 1));//第二个元素的地址   x

    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("%d\n", sizeof(arr)); //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
    printf("%d\n", sizeof(&arr[0] + 1));//指向第二个元素的地址  4

    printf("%d\n", strlen(arr));//找不到\0,求出的是随机值
    printf("%d\n", strlen(arr + 0)); //x
    printf("%d\n", strlen(*arr));//err 参数是指针 
    printf("%d\n", strlen(arr[1])); //erro参数是指针 
    printf("%d\n", strlen(&arr));//x
    printf("%d\n", strlen(&arr + 1));//指向下一个数组  x-6
    printf("%d\n", strlen(&arr[0] + 1));//第二个元素的地址  x-2

    int a[] = { 1, 2, 3, 4 };
    printf("%d\n", sizeof(a));//数组名放在sizeof后面 代表整个数组  16
    printf("%d\n", sizeof(a + 0));//a不是单独放在sizeof后  代表首元素的地址  4
    printf("%d\n", sizeof(*a));//a是首元素的地址  解引用是1 一个整形4个字节  4
    printf("%d\n", sizeof(a + 1));//是第二个元素的地址  地址的字节为四  4
    printf("%d\n", sizeof(a[1]));//表示下标为1的元素的地址     4
    printf("%d\n", sizeof(&a));//取地址数组名代表整个数组的地址  4
    printf("%d\n", sizeof(&a + 1));//指向整个数组后面的空间的地址  4
    printf("%d\n", sizeof(&a[0]));//数组第一个元素的地址         4
    printf("%d\n", sizeof(&a[0] + 1));// 数组第二个元素的地址    4
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值