简体   繁体   中英

Pointers and char arrays from strings

Hi I have been reading for hours and still can't grasp the conversions between

{
    char i ="adf";
    char foo[];
    char bar[256];
}

and adding * and & makes it more confusing

I have some code that is working.

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);
}

code is working but I need help with 2 parts.

  1. I want to be able to run this function like kind of like printf IE TX_SEND("AT+CGMSD=STUFF"); but I am stuck

but before hand I do this alot.

 char txsend[] = "at";
 TX_SEND(txsend);
  1. Also inside my TX_WRITE() I am using write(fd,&send[0],3) , but it is hardcoded to send 3 bytes from send[] . I want this to be dynamic so I can just send strings at any length (realistically they will be less than 300 ASCII chars always). I tried to do something with a pointer in there but gave up ( *p_tx_buffer was my beginning attempt).

i think you want

int TX_SEND(char *send)
{


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

you cannot tack on \\n to send with strcat. I would add it in the calling function, or declare an intermediate buffer and sprintf to it

like this

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);
}

I'm not going to go through your code line-by-line, but I urge you to focus on these facts:

  1. chars are chars and strings are strings, and never the twain shall meet. (They're totally different.)
  2. 'x' is a character constant.
  3. "x" is a string constant.
  4. A string is an array of characters (terminated by '\\0' ).
  5. When you mention an array (including a string) in a context where you need its value, what you get is a pointer to the array's first element.
  6. When you put a & in front of something, what you get is a pointer to that something.
  7. When you put a * in front of a pointer, what you get is the thing that the pointer points to.

Putting this together, we could write

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);

If you're just starting with C, you may not have come across rule 5 yet. It will probably surprise you at first. Learn it well, though: you'll never understand arrays and pointers in C without it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM