【C编程问题集中营】使用数组指针时容易踩得坑

在这里插入图片描述

【C编程问题集中营】使用数组指针时容易踩得坑

一、获取数组首地址

一维数组的首地址即数组第一个元素的指针,常用的获取一维数组首地址的方式有如下几种,以unsigned char类型的TestArray[4]数组举例:

  • TestArray
  • &TestArray[0];
  • &TestArray;

代码中通过以上三种方式中的任意一种方式均可获取到TestArray[4]数组的首地址,通过第三种方式获取数组首地址时,与其他两种在对首地址使用时表现有可能是不一样的,需要特别注意下,下面会对其应用场景进行举例;

二、应用场景举例

2.1 正常场景

正常场景的代码实现举例如下所示:

#include "stdio.h"

unsigned char TestArray[4]   = {11u, 22u, 44u, 55u};
unsigned char TestArray_1[4] = {66u, 77u, 88u, 99u};

void TestArrayDataFun(unsigned char *Data)
{
    if (Data != NULL)
    {
        printf("TestArrayDataFun: %d %d\r\n", *Data, *(Data + 1));
    }
}

int main(void)
{
    TestArrayDataFun(TestArray);
    TestArrayDataFun(&TestArray[0]);
    TestArrayDataFun(&TestArray);

    return 0;
}

从功能上来看,TestArrayDataFun函数会输出打印传入指针的第一个和第二个数组元素,对应的就是想输出TestArray数组的第一个和第二个元素,代码输出结果如下所示:

TestArrayDataFun: 11 22
TestArrayDataFun: 11 22
TestArrayDataFun: 11 22

从输出结果来看,三种获取数组首地址的方式是一样的。

2.2 异常场景

异常场景的代码实现举例如下所示:

#include "stdio.h"

unsigned char TestArray[4]   = {11u, 22u, 44u, 55u};
unsigned char TestArray_1[4] = {66u, 77u, 88u, 99u};

void TestArrayDataFun(unsigned char *Data)
{
    if (Data != NULL)
    {
        printf("TestArrayDataFun: %d %d\r\n", *Data, *(Data + 1));
    }
}

int main(void)
{
    TestArrayDataFun(TestArray);
    TestArrayDataFun(&TestArray[0]);
    TestArrayDataFun(&TestArray);

    TestArrayDataFun(TestArray + 1);
    TestArrayDataFun(&TestArray[0] + 1);
    TestArrayDataFun(&TestArray + 1);

    return 0;
}

从上述代码的逻辑来看,想要实现的功能是分别采用三种获取数组首地址的方式来打印出数组的第一个和第二个元素以及数组的第二个和第三个元素,最终代码执行后的结果如下所示:

TestArrayDataFun: 11 22
TestArrayDataFun: 11 22
TestArrayDataFun: 11 22
TestArrayDataFun: 22 44
TestArrayDataFun: 22 44
TestArrayDataFun: 66 77

前5个输出的结果与我们预期的一致,但是最后一个输出的结果与我们预期的不一致,大家可以仔细看下代码逻辑,输出的66和77是TestArray_1数组的第一个和第二个元素,并非TestArray数组的第二个和第三个元素,这是因为什么呢?

三、总结

直接说结论,以&TestArray方式获取数组首地址指针,其指针类型为整个数组大小对应的指针类型,在对其指针进行+1操作时,其指针偏移直接偏移了整个数组的大小,即偏移到了TestArray_1数组的首地址位置,所以再去提取数据时就取到了TestArray_1数组的第一个和第二个元素。

而为什么调用 TestArrayDataFun(&TestArray);函数,在函数内部进行+1操作就没有问题呢,是因为传参时相当于进行的强制类型转换,将其指针类型强转为unsigned char *,因此后续对其进行+1操作时只偏移了一个字节的地址;

资源下载链接为: https://pan.quark.cn/s/67c535f75d4c 在Android开发中,为了提升用户体验和视觉效果,背景模糊化处理是一种常用的设计手段。它可以为应用界面增添层次感,同突出显示主要内容。本文将详细介绍如何在Android中实现背景模糊化功能。 首先,我们需要获取当前设备的壁纸作为背景。这可以通过WallpaperManager类来完成。调用WallpaperManager.getInstance(this.getContext())可以获取壁纸管理器实例,然后通过getDrawable()方法获取当前壁纸的Drawable对象。接下来,需要将壁纸Drawable转换为Bitmap对象,因为模糊处理通常需要在Bitmap上进行。可以通过((BitmapDrawable) wallpaperDrawable).getBitmap()来完成这一转换。 模糊处理的核心是使用Android的RenderScript API。RenderScript是一种高效的并行计算框架,特别适合处理图像操作。在blur()方法中,我们创建了一个RenderScript实例,并利用ScriptIntrinsicBlur类来实现模糊效果。ScriptIntrinsicBlur提供了设置模糊半径(setRadius(radius))和执行模糊操作(forEach(output))的方法。模糊半径radius可以根据需求调整,以达到期望的模糊程度。 然而,仅依赖ScriptIntrinsicBlur可能无法达到理想的模糊效果,因此我们还需要对原始图片进行缩放处理。为此,我们设计了small()和big()方法。先将图片缩小(small()),然后执行模糊操作,最后再将图片放大(big())。这种方式不仅可以增强模糊效果,还能在一定程度上提高处理速度。在small(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浩如烟海·灿若星辰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值