我想我也许终于在指针理解上有了一点突破,但我正在努力解决一个看似简单的问题,我想让一个指针与另一个指针指向相同的内存地址,例如:
char* foo = "foo"; // memory address: 0x7ffdabc4dbf8
char* bar = "bar"; // memory address: 0x7ffdabc4dbf0
如何将 foo 指向与 bar 相同的地址?我知道如何更改该值,例如:
foo = bar; // foo is now "bar" but the memory address is the same as before
我做了一些实验:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
void print_info(char* string1, char* string2) {
printf("Memory address of string1: %p\n", &string1);
printf("Memory address of string2: %p\n", &string2);
printf("Value of string1: %s\n", string1);
printf("Value of string2: %s\n", string2);
printf("\n");
}
void change(char** ptr1, char** ptr2) {
*ptr1 = *ptr2;
}
int main() {
printf("Initial values: string1 = \"foo\" string2 = \"bar\"\n\n");
char* string1 = "foo"; // Pointer to a string literal?
char* string2 = "bar"; // Pointer to a string literal?
print_info(string1, string2);
// Modifying value, the pointer have the same memory address as before
string1 = string2;
printf("string1 = string2\n\n");
print_info(string1, string2);
string2 = "bas";
printf("string2 = \"bas\"\n\n");
print_info(string1, string2);
change(&string1, &string2);
printf("change(&string1, &string2)\n\n");
print_info(string1, string2);
char *ptr = string1;
printf("char *ptr = string1\n\n");
printf("Memory address of ptr: %p\n", &ptr);
printf("Value of ptr: %s\n\n", ptr);
printf("Trying to change pointers directly:\n\n");
printf("&string1 = &string2\n");
printf("GCC: error: lvalue required as left operand of assignment\n\n");
//&string1 = &string2;
printf("string1 = &string2\n");
printf("GCC: warning: assignment to ‘char *’ from incompatible pointer type ‘char **’\n\n");
string1 = &string2;
print_info(string1, string2);
printf("&string1 = *string2\n");
printf("GCC: error: lvalue required as left operand of assignment\n\n");
//&string1 = *string2;
//print_info(string1, string2);
printf("string1 = *string2\n");
printf("GCC: warning: assignment to ‘char *’ from ‘char’ makes pointer from integer without a cast\n\n");
//string1 = *string2;
//print_info(string1, string2);
printf("Segmentation fault (core dumped)\n\n");
printf("*string1 = &string2\n");
printf("GCC: warning: assignment to ‘char’ from ‘char **’ makes integer from pointer without a cast\n\n");
*string1 = &string2;
print_info(string1, string2);
printf("Corruption?\n");
return EXIT_SUCCESS;
}
输出:
Initial values: string1 = "foo" string2 = "bar"
Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: foo
Value of string2: bar
string1 = string2
Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: bar
Value of string2: bar
string2 = "bas"
Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: bar
Value of string2: bas
change(&string1, &string2)
Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: bas
Value of string2: bas
char *ptr = string1
Memory address of ptr: 0x7fffc52760d8
Value of ptr: bas
Trying to change pointers directly:
&string1 = &string2
GCC: error: lvalue required as left operand of assignment
string1 = &string2
GCC: warning: assignment to ‘char *’ from incompatible pointer type ‘char **’
Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: � @
Value of string2: bas
&string1 = *string2
GCC: error: lvalue required as left operand of assignment
string1 = *string2
GCC: warning: assignment to ‘char *’ from ‘char’ makes pointer from integer without a cast
Segmentation fault (core dumped)
*string1 = &string2
GCC: warning: assignment to ‘char’ from ‘char **’ makes integer from pointer without a cast
Memory address of string1: 0x7fffc52760b8
Memory address of string2: 0x7fffc52760b0
Value of string1: � @
Value of string2:
Corruption?
是否可以更改堆栈指针指向的地址?或者只能使用堆指针? (malloc?)
定义之后
char* foo = "foo";
char* bar = "bar";
你的记忆看起来像这样
+-----+ +--------+ |富| ---->| “富”| +-----+ +--------+ +-----+ +--------+ |酒吧| ---->| “酒吧”| +-----+ +--------+
然后你做作业:
foo = bar;
这导致内存看起来像这样:
+-----+ +--------+ |富| -\ | “富”| +-----+ | +--------+ | +-----+ | +--------+ |酒吧| ->-->| “酒吧”| +-----+ +--------+
现在变量
foo
和 bar
都指向同一事物,但变量本身仍然是独立且不同的实体,并为它们分配了自己的内存。