微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

*--a = *--b 在 C 中是什么意思

如何解决*--a = *--b 在 C 中是什么意思

假设 ab 是指针,

我的理解是 *--a = *--b 表示使用指针算法从 ab 中减去 1,然后取消引用 ab 并将它们设置为相等。>

这相当于

--a;
--b;
*a=*b

同样是什么

*a++ = *b++;

相当于?

解决方法

*a++ = *b++;

取消引用 b 并将其分配到 a 指向的位置。 ++ 是后缀运算符,因此 *b 的当前值将分配给 *a,然后两者都会递增。

如果您将其保留在 while 循环中,则 b 中的所有字符都将被复制到 a,包括 \0。只要 *a++ = *b++ 不是 \0,此过程就会继续,此时循环终止。

while(*a++ = *b++);

示例:

#include <stdio.h>

int main()
{
    char a_arr[30]  = {0};
    char b_arr[] = "Hello,World";
    
    char *a = a_arr;
    char *b = b_arr;
    
    while(*a++ = *b++);
    
    puts(a_arr);
    puts(b_arr);
    
    return 0;
}
,

示例

uint8_t *a = 1030; // POINTS TO ADDRESS 1030
uint8_t *b = 1020; // POINTS TO ADDRESS 1020

printf("%d",*(--a)); // PRINTS VALUE ON ADDRESS 1029
printf("%d",*(b++)); // PRINTS VALUE ON ADDRESS 1021

*(--a) 减去一个字节(一个地址),因为指针 a 指向一个字节(它是 uint8_t)。减法后,从地址中读取值。

*(--something) 你可以写成

uint32_t *c = 1050;
c -= 1; // SUBCTRACTS 4 BYTE ADDRESS FROM POINTER c
print("%d",*c);

你可能会问为什么是 4 个字节?因为指针 c 指向四字节(uint32_tint32_t)数据。您可以使用 sizeof(variable) 获取以字节为单位的数据大小。

在您的情况下,假设指针 a 指向地址 40。指针 b 指向地址 50。

  • 地址 39 持有值 1

  • 地址 40 持有值 2

  • 地址 50 持有值 10

  • 地址 51 持有值 11

     uint8_t *a = 40;
     uint8_t *b = 50;
    
     printf("%d",*(--a));
     printf("%d",*(b++));
    

第一个 printf 将打印值 1。第二个 printf 将打印值 50printf后指针a指向地址39,指针b指向地址51

原因?在第一个 printf 中,它会先减去一个地址(同样是一个地址,因为它指向一个字节值),然后它会解引用值(这就是为什么我们使用 * 从指针中读取值地址)。

在第二个 printf 中,它将首先取消引用值,然后将指针向上移动一个地址。

,
*––a = *––b 

逻辑上等价于

tmpa = a - 1
tmpb = b - 1
*tmpa = *tmpb
a = a - 1
b = b - 1

需要注意的是,对 ab*tmpa 的更新可以以任何顺序发生,而且这些更新甚至可以交错进行。实现也可以跳过临时变量并立即更新指针值:

a = a - 1
b = b - 1
*a = *b

但这不是必需的或保证的。同样,

*a++ = *b++

在逻辑上等价于

tmpa = a
tmpb = b
*tmpa = *tmpb
a = a + 1
b = b + 1

ab*tmpa 的更新顺序有相同的警告。同样,实现可能会跳过使用临时变量并将其评估为

*a = *b
a = a + 1
b = b + 1

但这又不是必需的,也不是保证。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。