C语言 -- 指针与数组易混淆题目

指针和数组经典题目

首先需要把握以下几个概念:

  1. 在32位平台上,指针(地址)的大小总是4个字节
  2. sizeof(数组名),该数组名代表整个数组,计算的是整个数组的大小
  3. &数组名,该数组名也代表整个数组,取出的是整个数组的地址
  4. 除以上两种情况外,数组名表示的是首元素的地址
  5. 对二维数组来说,首元素是第一行元素

一维数组

int a[] = {1,2,3,4}; //4个元素,int类型4个字节

  • printf("%d\n",sizeof(a)); // 16
    printf("%d\n",sizeof(a+0)); //地址4
    printf("%d\n",sizeof(*a)); //第一个元素int类型4
    printf("%d\n",sizeof(a+1)); //地址4
    printf("%d\n",sizeof(a[1])); //int类型4字节
    printf("%d\n",sizeof(&a)); //指针4字节
    printf("%d\n",sizeof(*&a)); //整个数组16字节
    printf("%d\n",sizeof(&a+1)); //地址4
    printf("%d\n",sizeof(&a[0])); //地址4
    printf("%d\n",sizeof(&a[0]+1)); //地址4

字符数组

char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’ }; //该字符数组6个元素,char类型一个字节

  • 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
    printf("%d\n", sizeof(&arr[0] + 1)); //4
  • printf("%d\n", strlen(arr)); //因为没有结束标识符‘\0’,输出是随机数
    printf("%d\n", strlen(arr + 0)); //随机数
    //printf("%d\n", strlen(*arr)); //报错
    //printf("%d\n", strlen(arr[1])); //报错
    printf("%d\n", strlen(&arr)); //随机数
    printf("%d\n", strlen(&arr + 1)); //随机数
    printf("%d\n", strlen(&arr[0] + 1)); //随机数

字符串(字符数组)

char arr[] = “abcdef”; //7个元素(包含结束标识符‘\0’,char类型1个字节)

  • 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
    printf("%d\n", sizeof(&arr[0] + 1)); //4
  • printf("%d\n", strlen(arr)); //6
    printf("%d\n", strlen(arr + 0)); //6
    //printf("%d\n", strlen(*arr)); //报错
    //printf("%d\n", strlen(arr[1])); //报错
    printf("%d\n", strlen(&arr)); //6
    printf("%d\n", strlen(&arr + 1)); //随机数
    printf("%d\n", strlen(&arr[0] + 1));//5

字符串(指针)

char* p = “abcdef”; //指针,7个元素

  • 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
  • printf("%d\n", strlen(p)); //6
    printf("%d\n", strlen(p + 1)); //5
    //printf("%d\n", strlen(*p)); //报错
    //printf("%d\n", strlen(p[0])); //报错
    printf("%d\n", strlen(&p)); //随机
    printf("%d\n", strlen(&p + 1)); //随机
    printf("%d\n", strlen(&p[0] + 1)); //5

二维数组

int a[3][4] = { 0 }; //12个int类型

  • 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
    printf("%d\n", sizeof(*(a[0] + 1))); //第一行第二个元素 4
    printf("%d\n", sizeof(a + 1)); //指针 4
    printf("%d\n", sizeof(*(a + 1))); //16
    printf("%d\n", sizeof(&a[0] + 1)); //4
    printf("%d\n", sizeof(*(&a[0] + 1))); //16
    printf("%d\n", sizeof(*a)); //第一行 16
    printf("%d\n", sizeof(a[3])); //越界,16
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值