如何理解数组与指针变量在c/c++中的不同

一、问题

        c/c++中指针与数组名在很多时候经常看作是一个东西。比如一个明明是指针变量却像数组一样用中括号取值,数组名也当成一个常量指针变量来用。那么这两个在代码编写里核心的区别是什么?使用起来有什么不一样?

二、在拷贝中看出两者的差异

        1、指针与数组的最大区别是:数组变量的空间可自定义大小,而指针变量却只是一个四字节的指针类型(假设32位机器)<不要把指针变量的指向的空间当成自己的>。就是这个区别导致在代码中使用两者时出现场景上的分化。

        2、这种分化出现在含有”拷贝“操作的时候。例如:

/****************************************************************************/

struct name1{
    uint8_t str[30];
} LC1 = {.str = "打钱居士233"};

struct name2{
    uint8_t *str;
} LC2;
LC2.str = (uint8_t *)malloc(30, sizeof(uint8_t));//使用全局变量申请的空间不可重入,不能在这个例子使用,同时使用函数传参的方式依旧是一个可能会二次修改的隐患
copy(LC2.str, "打钱居士233");

/* 分别把这两个变量以消息发送到队列 */
bool result1 = queueSend(queueHandler1, LC1, sizeof(struct name1));//队列的定义省略
bool result2 = queueSend(queueHandler2, LC2, sizeof(struct name2));//无法拷贝malloc的


/****************************************************************************/

/* 下面是接收 */
void dqjs_233(void *parameter)
{
    while(true){
        struct name1 LC1 = queueReceive(queueHandler1);
        /* 看下面,还需要做一次释放动态内存的操作,但是很容易出问题 */
        struct name2 LC2 = queueReceive(queueHandler2);
        free(LC2.str);
    }
}

        3、在包含有拷贝的场景时,使用数组在上面的例子就相当于全程是局部变量,有编译器生成释放空间。而使用指针却是自己要控制空间的释放申请(强烈不建议在不同的函数里申请跟释放空间,内存泄露预定)。

        4、当然在上面的例子也可以轻易想到用函数封装功能。但值得注意,指针变量的空间是4字节,拷贝只会拷贝指针的值而非其指向的地址。从而有被二次修改的风险。

        5、而数组不会,在这个例子里同时规避了后面代码泄露的风险,也规避前面代码的二次修改的风险。数组跟指针变量就是在这个含有”拷贝“的场景中被区分出谁更合适使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值