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;
}
也就是必须用前者!!!