问题描述
假设 a
和 b
是指针,
我的理解是 *--a = *--b
表示使用指针算法从 a
和 b
中减去 1,然后取消引用 a
和 b
并将它们设置为相等。>
这相当于
--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_t
或 int32_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
将打印值 50
。
printf
后指针a
指向地址39
,指针b
指向地址51
原因?在第一个 printf
中,它会先减去一个地址(同样是一个地址,因为它指向一个字节值),然后它会解引用值(这就是为什么我们使用 *
从指针中读取值地址)。
在第二个 printf
中,它将首先取消引用值,然后将指针向上移动一个地址。
*––a = *––b
逻辑上等价于
tmpa = a - 1
tmpb = b - 1
*tmpa = *tmpb
a = a - 1
b = b - 1
需要注意的是,对 a
、b
和 *tmpa
的更新可以以任何顺序发生,而且这些更新甚至可以交错进行。实现也可以跳过临时变量并立即更新指针值:
a = a - 1
b = b - 1
*a = *b
但这不是必需的或保证的。同样,
*a++ = *b++
在逻辑上等价于
tmpa = a
tmpb = b
*tmpa = *tmpb
a = a + 1
b = b + 1
对 a
、b
和 *tmpa
的更新顺序有相同的警告。同样,实现可能会跳过使用临时变量并将其评估为
*a = *b
a = a + 1
b = b + 1
但这又不是必需的,也不是保证。