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