来自字符串的指针和字符数组
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 个部分的帮助。
- 我希望能够 运行 这个功能有点像
printf IE TX_SEND("AT+CGMSD=STUFF");
但我卡住了
但之前我经常这样做。
char txsend[] = "at";
TX_SEND(txsend);
- 也在我的
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);
}
我不会逐行查看您的代码,但我敦促您关注以下事实:
- 字符是字符,字符串是字符串,两者永远不会相遇。 (他们完全不同。)
- 'x'是一个字符常量。
- "x" 是字符串常量。
- 字符串是一个字符数组(以
'[=11=]'
结尾)。
- 当您在需要其值的上下文中提及数组(包括字符串)时,您得到的是指向数组第一个元素的指针。
- 当你把
&
放在某个东西前面时,你得到的是指向那个东西的指针。
- 当你在一个指针前面加上一个
*
,你得到的就是指针所指向的东西。
把这些放在一起,我们可以写成
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 中的数组和指针。
嗨,我已经阅读了几个小时,但仍然无法理解
之间的转换{
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 个部分的帮助。
- 我希望能够 运行 这个功能有点像
printf IE TX_SEND("AT+CGMSD=STUFF");
但我卡住了
但之前我经常这样做。
char txsend[] = "at";
TX_SEND(txsend);
- 也在我的
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);
}
我不会逐行查看您的代码,但我敦促您关注以下事实:
- 字符是字符,字符串是字符串,两者永远不会相遇。 (他们完全不同。)
- 'x'是一个字符常量。
- "x" 是字符串常量。
- 字符串是一个字符数组(以
'[=11=]'
结尾)。 - 当您在需要其值的上下文中提及数组(包括字符串)时,您得到的是指向数组第一个元素的指针。
- 当你把
&
放在某个东西前面时,你得到的是指向那个东西的指针。 - 当你在一个指针前面加上一个
*
,你得到的就是指针所指向的东西。
把这些放在一起,我们可以写成
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 中的数组和指针。