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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: - 指针和数组结合在一起历来是`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);

在这里插入图片描述

相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
38 3
|
28天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
1月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
1月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
1月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
10天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
39 0
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
58 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
49 2
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
39 1
|
2月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。

推荐镜像

更多