2

我试图理解 C 中的整个指针和取消引用的东西。我几乎明白了,但遇到了非常简单的代码,结果我不明白:

char *ptr = "Characters";
char val = *ptr;
char *chrptr = &val;
printf("Value under character pointer is: %p / %c\n", &val, val);
printf("Dereferenced character pointer: %p\n", chrptr);
printf("Array pointer: %p\n", ptr);

现在,正如我在执行之前所理解的那样ptr == chrptr == &val,但实际上ptr != chrptr == &val。为什么是这样?

4

7 回答 7

4
char *ptr = "Characters"; // returns a pointer to 'C'
char val = *ptr; // dereferences the pointer to 'C' and copies 'C' into val

val有自己的内存位置,所以val的地址会不一样

 char *chrptr = &val; //chptr points to val. A different memory location.
于 2012-10-31T15:50:40.117 回答
2
char *ptr = "Characters";

       +---+---+---+---+---+---+---+---+---+---+----+ 
ptr -> | C | h | a | r | a | c | t | e | r | s | \0 |
       +---+---+---+---+---+---+---+---+---+---+----+ 

char val = *ptr; // you copy 'C' by value from the array, ptr is still pointing 
                 // where it originally pointed

// &val is somewhere else in memory so

char *chrptr = &val;

          +---+ 
chrptr -> | C |
          +---+ 

如果你想要 chrptr 点 ptr 点然后写

char* chrptr = ptr;
于 2012-10-31T16:08:49.963 回答
1

当您分配给 achar时,会生成一个副本。因此,该副本的地址将不等于原始字符串。

相反,当您分配给指针时,您分配的是原始字符串的地址(或任何它的指针)。

于 2012-10-31T15:49:47.923 回答
1
ptr == chrptr == &val

只有chrptr == &val部分是正确的,但是ptr != chrptr。这是因为val它是的第一个字符的副本ptr,即'C'。副本存储在与原始不同的位置,因此其在内存中的地址不同。

于 2012-10-31T15:50:49.363 回答
0

字符串“Characters”被编译器定位在一个内存区域,而变量“val”(等于'C')位于另一个内存区域。这就是 &val 不等于“ptr”的原因。

于 2012-10-31T15:51:52.967 回答
0

别介意所有的间接变量和局部变量,但你的问题归结为与这个相同:

int a = 1;
int b = 1;

两者ab具有相同的值,但它们显然是不同的对象,因此它们具有不同的地址。val和也是如此 ptr[0]

于 2012-10-31T15:51:55.050 回答
0

您的代码执行以下操作。

char *ptr = "Characters"; //- Store "Characters" in read only data section and assign the address to variable to `ptr`.

char val = *ptr; //- Assign the value 'C' (i.e 67) to stack variable val.

char *chrptr = &val; //- Assign the address of variable val to chrptr

val是一个堆栈变量,因此它的地址将在堆栈地址范围内。但是字符串文字存储在只读数据部分中。而且只有 ptr 持有那个地址。

很明显&valptr是两个不同的地址。

于 2012-10-31T15:59:00.943 回答