指针数组进阶

本文详细探讨了C语言中指针与数组在使用sizeof和strlen时的差异和注意事项,涵盖了整型数组、字符数组和指针数组的实例解析,以及二维数组的用法。通过实例分析,帮助读者深入理解指针和数组的本质,并提供了相关笔试题进行巩固。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

指针与数组中的sizeof与strlen

1、一维数组

整型数组

字符数组

指针数组

2、二维数组

指针笔试题 

笔试题1:

笔试题2:

笔试题3:

 笔试题4:

笔试题5:

前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽。接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧!

指针与数组中的sizeof与strlen

1、sizeof

sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作符。

2、strlen

strlen是计算字符串中\0之前出现了多少个字符,只针对字符串,是一个库函数。

3、数组名

数组名是数组首元素地址,但是在这里有两个例外:

(1)sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。

(2)&数组名,这里的数组名也表示整个数组,取出的是数组的地址

除了上面两种情况外,所有的数组名表示的都是数组首元素地址。

下面我们就来看一看数组、指针的一些运用

1、一维数组

整型数组

#include<stdio.h>
int main()
{
    //一维数组
    int a[] = {1,2,3,4};

    printf("%d\n",sizeof(a));// 16
    printf("%d\n",sizeof(a+0));// 4/8
    printf("%d\n",sizeof(*a));// 4
    printf("%d\n",sizeof(a+1));// 4/8
    printf("%d\n",sizeof(a[1]));// 4
    printf("%d\n",sizeof(&a));// 4/8
    printf("%d\n",sizeof(*&a));// 16
    printf("%d\n",sizeof(&a+1));// 4/8
    printf("%d\n",sizeof(&a[0]));// 4/8
    printf("%d\n",sizeof(&a[0]+1));// 4/8

    return 0;
}

接下来我们就一句一句讲解:

sizeof(a)

数组名a单独放在sizeof内部,计算的是整个数组的大小,单位是字节,所以计算结果:4*4=16个字节。

sizeof(a+0)

a没有单独存放,所以表示的是首元素的地址,a+0还是数组首元素的地址,是地址的话大小就是4/8个字节。(在32位环境下为4,64位环境下为8)

sizeof(*a)

a表示的是首元素的地址,*a就是对首元素的地址解引用,所以就是首元素,大小为4个字节

sizeof(a+1)

a表示首元素地址,a+1就是第二个元素的地址,是地址的话大小就是4/8个字节。

sizeof(a[1])

a[1]表示数组的第二个元素,大小是4个字节。

sizeof(&a)

&a表示的是整个数组的地址,数组的地址也是地址,所以大小为4/8个字节。

sizeof(*&a)

&a是数组的地址,类型是int(*)[4],是一个数组指针,如果解引用,访问的就是4个int的数组,可以理解为*与&抵消效果,所以*&a相当于a,所以sizrof(a)是16。

sizeof(&a+1)

&a是数组地址,&a+1跳过整个数组后的地址,是地址就是4/8个字节大小。

sizeof(&a[0])

&a[0]取出的是数组第一个元素的地址,是地址就是4/8个字节大小。

sizeof(&a[0]+1)

&a[0]+1就是第二个元素的地址,是地址大小就是4/8个字节。

字符数组

#include<stdio.h>
int main()
{
    //字符数组
    char arr[] = {'a','b','c','d','e','f'};

    printf("%d\n", sizeof(arr));// 6
    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

    printf("%d\n", strlen(arr));// 随机值
    printf("%
### 关于 Java 数组进阶知识 #### 一、Java 中数组的基础特性 在 Java 编程语言中,数组是一种用于存储固定大小顺序集合的数据结构。尽管其基本概念简单明了,但在实际开发过程中,掌握一些高级技巧可以显著提升程序性能和可读性。 对于初学者来说,了解 `java.util.Arrays` 类的功能至关重要。该类提供了许多静态方法来操作数组,例如排序、搜索以及比较等功能[^2]。 --- #### 二、数组的操作与优化 以下是几个重要的数组进阶知识点: 1. **数组排序** 排序是处理数据的重要环节之一,在 Java 中可以通过调用 `Arrays.sort()` 方法实现快速排序功能。此方法内部实现了双轴快速排序算法 (Dual-Pivot Quicksort),适用于大规模数据集。 下面是一个简单的例子展示如何对整型数组进行升序排列并执行二分查找: ```java import java.util.Arrays; public class ArrayExample { public static void main(String[] args) { int[] arr = {5, 3, 2, 1, 4}; System.out.println("原始数组:" + Arrays.toString(arr)); // 对数组进行排序 Arrays.sort(arr); System.out.println("排序后的数组:" + Arrays.toString(arr)); // 执行二分查找定位目标值的位置 int index = Arrays.binarySearch(arr, 2); System.out.println("目标值 '2' 的索引位置为:" + index); } } ``` 2. **多维数组的应用** 多维数组是指具有两个或更多维度的数组形式。它们通常被用来表示矩阵或者表格数据。创建一个多维数组的方式如下所示: ```java int[][] matrix = new int[3][3]; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { matrix[i][j] = i * 3 + j; } } // 输出二维数组的内容 for(int[] row : matrix){ System.out.println(Arrays.toString(row)); } ``` 上述代码片段展示了如何初始化一个三维空间中的坐标网格,并打印出来以便观察结果[^1]。 3. **动态调整数组长度** 虽然传统意义上讲,一旦定义好了一个数组之后就不能改变它的尺寸;但是通过借助其他容器比如 ArrayList 可以间接达到这一目的。当遇到需要频繁增删元素的情况时考虑采用此类灵活解决方案会更加合适。 4. **自定义对象类型的数组管理** 当涉及到复杂业务逻辑的时候往往需要用到包含多个字段的对象作为单元格填充到列表里去。此时需要注意重写 equals 和 hashCode 方法确保能够正常参与各种集合运算过程之中。 --- #### 三、注意事项 - 在使用 `binarySearch` 前务必先完成排序工作,因为只有有序序列才能支持高效检索操作。 - 如果项目需求涉及大量随机访问场景,则优先选用基于指针机制设计的语言原生类型而非封装版本。 ---
评论 83
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱豆麻薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值