C初学者,指针&提领

时间:2012-10-31 15:47:41

标签: c pointers dereference

我试图在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。这是为什么?

7 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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 |
          +---+ 

如果你想要chtrtr指向ptr点,那么写

char* chrptr = ptr;

答案 2 :(得分:1)

当您分配到char时,会制作副本。因此该副本的地址不会等于原始字符串。

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

答案 3 :(得分:1)

ptr == chrptr == &val

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

答案 4 :(得分:0)

字符串“字符”由编译器定位在一个存储区中,但变量“val”(等于'C')位于其他存储区中。这就是为什么& val不等于“ptr”。

答案 5 :(得分:0)

不要介意所有间接和局部变量,但问题归结为与此相同:

int a = 1;
int b = 1;

ab都具有相同的值,但它们显然是不同的对象,因此它们具有不同的地址。 valptr[0]也是如此。

答案 6 :(得分: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是两个不同的地址。