周末看优快云- 重大发现-代码版本

本文通过几个案例深入探讨了C语言中指针与数组的关系及其使用技巧,特别是指针如何正确操作数组及二级指针的应用场景。
unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
void Get_ChipID(unsigned char *p)
{  
     p=(unsigned char *)(CHIP_ID_START);   
 }

int main(void)
{
unsigned char *p;
Get_ChipID(p);
G_print(p,12,0);
return 1;
}
//CASE1:此时P没有拿到数据 是随机无意义的数据 因为 指针不行!


unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
void Get_ChipID(unsigned char **p)
{  
     *p=(unsigned char *)(CHIP_ID_START);   
 }

int main(void)
{
unsigned char *p;
Get_ChipID(&p);
G_print(p,12,0);
return 1;
}
//CASE2:此时成功拿到!


unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
void Get_ChipID(unsigned char **p)
{  
     *p=(unsigned char *)(CHIP_ID_START);   
 }

int main(void)
{
unsigned char *p;
Get_ChipID(&p);
p[3]=100;
G_print(p,12,0);
G_print(CHIP_ID_START,12,0);
return 1;
}
//CSAE2:
思考1:此时看到修改P 其实也修改了CHIP_ID_START[3]
思考2:此时main必须 unsigned char p[20];不可以 error: cannot convert 'unsigned char (*)[20]' to 'unsigned char**' 

unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
void Get_ChipID(unsigned char *p)
{
     unsigned char i;
     unsigned char *pIDStart=(unsigned char *)(CHIP_ID_START);     
     for(i=0;i!=12;i++)
     {
       *p++=*pIDStart++;
     }
 }

int main(void)
{
unsigned char *p;
Get_ChipID(p);
G_print(p,12,0);
return 1;
}
//CASE3:根据优快云写的 编译没问题 run就嗝屁!!!!不知道问题在哪儿
思考:int main(void)unsigned char p[20];可以解决上面问题

继续确定问题的根源:
unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
void Get_ChipID(unsigned char *p)
{  
     unsigned char i;
     unsigned char *pIDStart=(unsigned char *)(CHIP_ID_START);     
     for(i=0;i!=12;i++)
     {
       printf("%d  ", *pIDStart++);
     }  
	   *p++;
    // p[2]=88;
 }

int main(void)
{
unsigned char *p;
Get_ChipID(p);
G_print(p,12,0);
return 1;
}//此时OK 就是p[2]=88;一旦放开就会嗝屁!结论:不能给指针赋值 它不是数组 它没有内存

问题:优快云的为什么成功?
终于明白了!优快云的代码有一个巨大的巧合!
它这个函数必须用数组的,为什么指针也成功了?因为之前它二级指针搞了一下,把指针给了内存变成数组了!

类似在这样:
unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
void Get_ChipID(unsigned char *p)
{  
     unsigned char i;
     unsigned char *pIDStart=(unsigned char *)(CHIP_ID_START);     
     for(i=0;i!=12;i++)
     {
       *p++ = *pIDStart++;
     }  
     
    
 }

int main(void)
{
unsigned char ARR[20]={1,2,3,4,5,6,7,8,9,10,11,11};
unsigned char *p;
p=ARR;
Get_ChipID(p);
G_print(p,12,0);
G_print(ARR,12,0);
return 1;
}//OK 都变成12

结论:希望指针指向数组,如何在一个流程里面直接
unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
unsigned char *pIDStart=(CHIP_ID_START); 
就可以啦 指针变成数组 非常简单
如果你要拉一个函数到外面去单独做这个事情,必须用二级指针
unsigned char CHIP_ID_START[20]={1,2,3,4,5,6,7,8,9,10,11,12};
void Get_ChipID(unsigned char **p)
{  
     *p=(unsigned char *)(CHIP_ID_START);   
 }

int main(void)
{
unsigned char *p;
Get_ChipID(&p);
}

再说一个类似的问题:也是拉函数 参数的问题


#define COUNTOF(ARR) sizeof(ARR)/sizeof(*ARR)
 uint8_t countof(uint8_t *arr)
 {
printf("%d===",sizeof(arr));//4---!!!传进来就是4啦 指针了
printf("%d===",sizeof(arr[0]));//1
return sizeof(arr)/sizeof(*arr);//4
  }
  
int main(void)
{
printf("%d---%d",COUNTOF(CHIP_ID_START),countof(CHIP_ID_START));//20-4
return 1;
}
也就是必须用前者!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值