来自字符串的指针和字符数组

Pointers and char arrays from strings

嗨,我已经阅读了几个小时,但仍然无法理解

之间的转换
{
    char i ="adf";
    char foo[];
    char bar[256];
}

并添加 *& 使其更加混乱

我有一些可用的代码。

int TX_SEND(char send[])
{
    unsigned char *p_tx_buffer;
    p_tx_buffer = &send[0];
    strcat(send, "\r");
    // Write to the port

    int n = write(fd,&send[0],3);
    if (n < 0) {
        perror("Write failed - ");
        return -1;
    }
    return(0);
}

代码可以正常工作,但我需要 2 个部分的帮助。

  1. 我希望能够 运行 这个功能有点像 printf IE TX_SEND("AT+CGMSD=STUFF"); 但我卡住了

但之前我经常这样做。

 char txsend[] = "at";
 TX_SEND(txsend);
  1. 也在我的 TX_WRITE() 中,我正在使用 write(fd,&send[0],3),但它被硬编码为从 send[] 发送 3 个字节。我希望它是动态的,这样我就可以发送任意长度的字符串(实际上它们总是少于 300 个 ASCII 字符)。我试图用那里的指针做一些事情但放弃了(*p_tx_buffer 是我的开始尝试)。

我想你想要

int TX_SEND(char *send)
{


    int n = write(fd,send,strlen(send));
    if (n < 0) {
            perror("Write failed - ");
            return -1;
    }
    return(0);
}

您不能添加 \n 以使用 strcat 发送。我会在调用函数中添加它,或者声明一个中间缓冲区和 sprintf

像这样

int TX_SEND(char *send)
{
    char buff[50]; // i dont know a good max size
    snprintf(buff, sizeof(buff), "%s\n", send);

    int n = write(fd,buff,strlen(buff));
    if (n < 0) {
            perror("Write failed - ");
            return -1;
    }
    return(0);
}

我不会逐行查看您的代码,但我敦促您关注以下事实:

  1. 字符是字符,字符串是字符串,两者永远不会相遇。 (他们完全不同。)
  2. 'x'是一个字符常量。
  3. "x" 是字符串常量。
  4. 字符串是一个字符数组(以'[=11=]'结尾)。
  5. 当您在需要其值的上下文中提及数组(包括字符串)时,您得到的是指向数组第一个元素的指针。
  6. 当你把 & 放在某个东西前面时,你得到的是指向那个东西的指针。
  7. 当你在一个指针前面加上一个*,你得到的就是指针所指向的东西。

把这些放在一起,我们可以写成

char str[] = "xyz";
char *p = str;       /* per rule 5, this is fine, and p gets a pointer to str's first element */
char c = *p;         /* per rule 7, c gets the first character of str, which is 'x' */
printf("%c\n", c);

如果您刚开始学习 C,您可能还没有遇到规则 5。一开始它可能会让您大吃一惊。不过,要好好学习它:没有它,你永远无法理解 C 中的数组和指针。