我试图理解一些代码的逻辑并使用指针。
因此,例如,如果声明了结构的两个指针(比如A和B)并且它们彼此相等, 然后结构中的数据通过其中一个指针改变,它是在第二个指针中改变还是只是重写?我想我的问题是:A和B字面上指向同一个东西还是指向另一个的副本?
代码执行如下操作:
somestruct *A;
somestruct *B;
B = A;
A->data = 5;
B->data = 6;
答案 0 :(得分:3)
在上面的例子中,他们会指出同样的事情。
然而,在使用之前和之后分配和释放内存也很重要,否则您将获得意外行为和/或分段错误。
somestruct *A;
somestruct *B;
A = malloc(sizeof(somestruct));
B = A;
A->data = 5;
B->data = 6;
printf("Data in A: %d", A->data); /* Prints 6 */
printf("Data in B: %d", B->data); /* Also Prints 6 */
...
free(A);
检查malloc的结果并确保操作成功也是一种很好的做法。如果您想要更改A指向的位置,并且还想要更改B指向的位置,这种情况可能会成为一个问题。除非您更改两者,否则更改一个指针位置将不会更新另一个。这是双指针将被使用的地方。 EG
somestruct *A;
somestruct **B;
A = malloc(sizeof(somestruct));
B = &A; // Get the address of A
A->member = 5;
printf("Member: %d", (*B)->member); /* Prints 5 */
free(A);
A = malloc(sifeof(somestruct));
A->member = 10;
printf("Member: %d", (*B)->member); /* Prints 10 */
请注意,在双指针示例中,B不需要再次更新。
请参阅此处的示例:Double Pointer
答案 1 :(得分:2)
A和B将字面指向相同的东西
答案 2 :(得分:2)
假设你做了类似这样的事情
somestruct *A;
somestruct *B;
A = malloc( sizeof(somestruct)) // addded this statement to show that memory allocation is done for A only
B = A;
A->data = 5;
B->data = 6;
这意味着现在指针B指向A指向的相同内存位置,因此无论你改变什么(通过使用A或B)都会改变指针数据,因为它本质上是相同的数据。现在只是指向2个指针(即A和B)。
答案 3 :(得分:1)
您正在更改指针,而不是指针引用的对象。也就是说,它是使用其中一个指针进行更改的对象。
例如
#include <stdio.h>
int main()
{
struct A { int i; } a = { 0 };
struct A *p1 = &a;
struct A *p2 = &a;
p1->i = 10;
printf( "%d\n", p2->i );
}
答案 4 :(得分:0)
指针不是结构,而只是一个内存地址(以及关于内存布局的编译器指令),因此当您通过指针操作时,您可以更改内存。给定另一个指针指向同一块内存,它指向更改的结构。
当然,如果你做这样的事情:
long *a = malloc(sizeof long);
long *b = a;
然后再说:
b = malloc(sizeof long);
然后a
不会更改,但b
是。