C · 进阶 | 指针和数组超细节笔试题解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: - 指针和数组结合在一起历来是`C语言`里面的难点,细节多如牛毛,今天博主就专门出一篇文章领略一下,专门总结了几乎所有细节部分,让我们开启沉浸式练习- 本系列分两个板块,前半部分直接上题,后半部分会有相应的解析

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


@TOC


前言

  • 指针和数组结合在一起历来是C语言里面的难点,细节多如牛毛,今天博主就专门出一篇文章领略一下,专门总结了几乎所有细节部分,让我们开启沉浸式练习
  • 本系列分两个板块,前半部分直接上题,后半部分会有相应的解析

指针和数组笔试题解析

1. 一维数组

1.1 整型数组

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));

1.2 字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
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";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
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));

2. 二维数组

2.1 整型数组

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
  • ==铁汁们加油!仔细刷题==

3. 一维数组解析

3.1 整型数组解析

    int a[] = { 1,2,3,4 };

    printf("%d\n", sizeof(&a + 1));//4/8
    //&a取出的是数组的地址
    //&a-->  int(*)[4]
    //&a+1 是从数组a的地址向后跳过了一个(4个整型元素的)数组的大小
    //&a+1还是地址,是地址就是4/8字节
    //
    printf("%d\n", sizeof(&a[0]));//4/8
    //&a[0]就是第一个元素的地址
    //计算的是地址的大小
    printf("%d\n", sizeof(&a[0] + 1));//4/8
    //&a[0]+1是第二个元素的地址
    //大小是4/8个字节
    //&a[0]+1 ---> &a[1]
    //

    printf("%d\n", sizeof(a));//16
    //sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
    printf("%d\n", sizeof(a + 0));//4
    //a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址
    //是地址,大小就是4/8个字节
    printf("%d\n", sizeof(*a));//4
    //*a中的a是数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素
    //首元素的大小就是4个字节
    printf("%d\n", sizeof(a + 1));
    //这里的a是数组首元素的地址
    //a+1是第二个元素的地址
    //sizeof(a+1)就是地址的大小
    printf("%d\n", sizeof(a[1]));//4
    //计算的是第二个元素的大小
    printf("%d\n", sizeof(&a));//4/8
    //&a取出的数组的地址,数组的地址,也就是个地址
    printf("%d\n", sizeof(*&a));//16
    //&a----> int(*)[4]
    //&a拿到的是数组名的地址,类型是 int(*)[4],是一种数组指针
    //数组指针解引用找到的是数组
    //*&a ---> a
    //
    //2.
    //&和*抵消了
    //*&a ---> a
    //

3.2 字符数组解析

    char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));//6
    //sizeof(数组名)
    printf("%d\n", sizeof(arr + 0));//4/8
    //arr + 0 是数组首元素的地址
    printf("%d\n", sizeof(*arr));//1
    //*arr就是数组的首元素,大小是1字节
    //*arr --> arr[0]
    //*(arr+0) --> arr[0]
    printf("%d\n", sizeof(arr[1]));//1
    printf("%d\n", sizeof(&arr));//4/8
    //&arr是数组的地址,是地址就是4/8个字节
    printf("%d\n", sizeof(&arr + 1));//4/8
    //&arr + 1是数组后的地址
    //
    printf("%d\n", sizeof(&arr[0] + 1));//4/8
    //&arr[0] + 1是第二个元素的地址
    //
    char arr[] = { 'a','b','c','d','e','f' };

    printf("%d\n", strlen(arr));//随机值
    printf("%d\n", strlen(arr + 0));//随机值

    printf("%d\n", strlen(*arr));//--> strlen('a');-->strlen(97);//野指针
    printf("%d\n", strlen(arr[1]));//-->strlen('b')-->strlen(98);

    printf("%d\n", strlen(&arr));//随机值
    printf("%d\n", strlen(&arr + 1));//随机值-6
    printf("%d\n", strlen(&arr[0] + 1));//随机值-1
    char arr[] = "abcdef";
    //[a b c d e f \0]
    printf("%d\n", sizeof(arr));//7
    printf("%d\n", sizeof(arr + 0));//4/8
    printf("%d\n", sizeof(*arr));//1
    printf("%d\n", sizeof(arr[1]));//1
    printf("%d\n", sizeof(&arr));//4/8
    printf("%d\n", sizeof(&arr + 1));//4/8
    printf("%d\n", sizeof(&arr[0] + 1));//4/8
    char arr[] = "abcdef";
    //strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数
    //strlen是库函数,只针对字符串
    //sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
    //sizeof是操作符
    //
    //[a b c d e f \0]
    printf("%d\n", strlen(arr));//6
    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));//随机值
    printf("%d\n", strlen(&arr[0] + 1));//5

4. 二维数组解析

4.1 整型数组解析

    int a[3][4] = { 0 };
    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(a[0][0]));
    printf("%d\n", sizeof(a[0]));
    //a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组
    //sizeof(a[0])计算的就是第一行的大小
    printf("%d\n", sizeof(a[0] + 1));
    //a[0]并没有单独放在sizeof内部,也没取地址,a[0]就表示首元素的地址
    //就是第一行这个一维数组的第一个元素的地址,a[0] + 1就是第一行第二个元素的地址
    printf("%d\n", sizeof(*(a[0] + 1)));
    //a[0] + 1就是第一行第二个元素的地址
    //*(a[0] + 1))就是第一行第二个元素
    printf("%d\n", sizeof(a + 1));//4/8
    //a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
    //a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址
    //a+1就是跳过第一行,表示第二行的地址
    printf("%d\n", sizeof(*(a + 1)));//16
    //*(a + 1)是对第二行地址的解引用,拿到的是第二行
    //*(a+1)-->a[1]
    //sizeof(*(a+1))-->sizeof(a[1])
    //
    printf("%d\n", sizeof(&a[0] + 1));//4/8
    //&a[0] - 对第一行的数组名取地址,拿出的是第一行的地址
    //&a[0]+1 - 得到的是第二行的地址
    //
    printf("%d\n", sizeof(*(&a[0] + 1)));//16
    printf("%d\n", sizeof(*a));//16
    //a表示首元素的地址,就是第一行的地址
    //*a就是对第一行地址的解引用,拿到的就是第一行
    //
    printf("%d\n", sizeof(a[3]));//16
    printf("%d\n", sizeof(a[0]));//16

    //int a = 10;
    //sizeof(int);
    //sizeof(a);

在这里插入图片描述

相关文章
|
3月前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
84 5
|
2月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
2月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
4月前
|
SQL 存储 算法
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
恒生科技2022年9月24号数据ETL工程师岗位的笔试题目及答案汇总,包括了SQL选择题、SQL编程题和业务应用SQL编程题,涵盖了数据库基础知识、SQL语句编写以及数据仓库概念等多个方面。
63 2
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
2020年奇安信秋招算法方向试卷1的题目解析,覆盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、主题模型、采样方法、图像处理等多个领域的知识点。
53 1
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
|
4月前
|
机器学习/深度学习 存储 算法
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
2020年奇安信秋招算法方向试卷3的题目解析,涵盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、PCA、词嵌入库等多个领域的知识点。
63 1
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
|
4月前
|
存储 JavaScript 前端开发
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
|
5月前
|
存储 算法 搜索推荐
深入解析String数组的操作与性能优化策略
深入解析String数组的操作与性能优化策略
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
29 0

推荐镜像

更多