C语言 数组 指针 变量问题如何解决?

最近做项目时发现一个问题,不知道有没有更简单的方法。
是这样的,我设定了一个包,也就是一个数组,长度是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];