最近做项目时发现一个问题,不知道有没有更简单的方法。
是这样的,我设定了一个包,也就是一个数组,长度是5,包里的元素只有第三个元素是变化的,就是command,我需要更改这个数然后再把包发出去。我就想用指针,指针不是间接寻址,用指针来指向这个元素,元素变化,这个数组也就变化。但是后来发现这个包中的command没有变化,所以只能更改一次command,再赋值来完成。不知道又没有更简洁一点的办法来解决。
以下是我简化问题的代码:
#include
#include
int main()
{
char command;
char packet[5]={0};
char *index = packet;
*index = 0x01;
*(index+1) = 0x02;
*(index+2) = command;
*(index+3) = 0x04;
*(index+4) = 0x05;
command = 0x01;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
command = 0x02;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
command = 0x03;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
command = 0x04;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
打印出来每个包都是一样的都是0102000405
所以我只能在每个command改变后重新对第三个元素赋值,才会改变包,不知道有没有更好的想法,可以指导一下。
你这command类型是char,不是指针呀,你应该定义成指针
或者直接修改packet[2]就行了,不用这么折腾呀
你非要用指针的话,应该定义char * command=&pack[2];
后面全部改成*command=0x04;
参考GPT和自己的思路:
首先要明确的是,指针只是一个用来指向内存地址的变量,它本身并不具备任何能力去改变其指向的内容。因此,通过指针来改变数组中的某个元素,并不会影响其他元素。
根据你的问题描述,我的理解是你希望能够动态改变数组中的第三个元素,以反映出这个变化,但是经过实验发现,这个改变并没有产生影响。我猜测,可能是你在改变变量 command 的值之后,并没有及时更新数组中的第三个元素的值,从而导致数组中的这个元素始终没有变化。
为了解决这个问题,你可以在修改 command 变量之后,通过指针重新给数组中的第三个元素赋值,从而实现动态改变。具体操作如下:
command = 0x01;
*(index+2) = command;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
command = 0x02;
*(index+2) = command;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
command = 0x03;
*(index+2) = command;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
command = 0x04;
*(index+2) = command;
for(int i=0; i<5; i++)
{
printf("%x",packet[i]);
}
这样,每次修改 command 变量之后,都会调用一次对数组中第三个元素重新赋值的操作,从而保证数组中这个元素的值随着变量 command 的改变而动态更新。
参考GPT和自己的思路:
您的想法是正确的,使用指针来间接寻址可以操作数组中的特定元素。但是,您遇到的问题是因为在使用指针更改command变量的值之后,您没有重新将其赋值给数组中的第三个元素。
因此,您需要在更改command变量的值之后,使用以下语句将其重新赋值给数组中的第三个元素:
*(index+2) = command;
这样,当您对command变量进行更改时,数组中的第三个元素也会随之改变。请看下面更改后的代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char command;
char packet[5] = {0};
char *index = packet;
*index = 0x01;
*(index + 1) = 0x02;
*(index + 2) = command;
*(index + 3) = 0x04;
*(index + 4) = 0x05;
command = 0x01;
*(index + 2) = command;
for (int i = 0; i < 5; i++)
{
printf("%x", packet[i]);
}
command = 0x02;
*(index + 2) = command;
for (int i = 0; i < 5; i++)
{
printf("%x", packet[i]);
}
command = 0x03;
*(index + 2) = command;
for (int i = 0; i < 5; i++)
{
printf("%x", packet[i]);
}
command = 0x04;
*(index + 2) = command;
for (int i = 0; i < 5; i++)
{
printf("%x", packet[i]);
}
}
这个代码可以生成符合您期望的结果。
command和数组并无直接关联,所以你改变command并不会改变数组内的任何值,要想纯粹改变第三个元素的值,可以这样定义command,
char *command=&packet[2];