两个指针å¯ä»¥ä½¿ç”¨ç›¸åŒçš„地å€å—? (代ç è¯´æ˜Žï¼‰

时间:2014-09-09 12:34:20

标签: c pointers

int i1;
int i2;

int *ptr1;
int *ptr2;

i1 = 1;
i2 = 2;

ptr1 = &i1;
ptr2 = ptr1;

*ptr1 = 3;
i2 = *ptr2;

有人å¯ä»¥å¸®æˆ‘解释这段代ç å—?特别是第八行,我认为它在pointer2中指定了pointer1的地å€ï¼Œæ˜¯å¦ä¼šä½¿æŒ‡é’ˆ2指å‘值1?

请有人帮助我。谢谢。

5 个答案:

答案 0 :(得分:1)

ptr2 = ptr1å°†ptr1(i1的地å€ï¼‰çš„值分é…ç»™ptr2。这使ptr2指å‘ptr1指å‘çš„åŒä¸€äº‹ç‰©ï¼Œå³å˜é‡i1。 ptr2指å‘çš„ä½ç½®ä¸­çš„值确实为1,但说ptr2指å‘值1似乎很奇怪。 ptr2的值是一个内存ä½ç½®ï¼Œè¯¥ä½ç½®å½“å‰åŒ…å«ä¸€ç»„ä½ï¼ˆå½“被解释为int时)表示值1。

答案 1 :(得分:1)

是的,多个指针å¯ä»¥æŒ‡å‘åŒä¸€ä¸ªä½ç½®ï¼Œè¿™ç§æƒ…况称为aliasing。虽然您æåŠçš„行确实使ptr2指å‘值1,但更é‡è¦çš„是它指å‘i1的存储,ptr1也是如此。因此,您å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼ä½¿ç”¨ä¸‰ä¸ªä¸åŒçš„å称æ¥è®¿é—®i1:*ptr1,*ptr2å’Œi1本身。因此,最åŽä¸¤è¡Œç¡®å®žå…·æœ‰é¡ºåºä¾èµ–性,并且程åºåœ¨i1å’Œi2中都以3结尾。

答案 2 :(得分:1)

int i1; //initialize 2 integers
int i2;

int *ptr1; //initialize 2 pointer to integers
int *ptr2;

i1 = 1; //storing values into the integer variables
i2 = 2;

ptr1 = &i1; //pointer ptr1 pointing to the address of the integer variable i1
ptr2 = ptr1; //pointer ptr2 pointing to the address pointed by ptr1 (perfectly ok)

*ptr1 = 3; //value at the address pointed by ptr1 changed to 3 (which changes the value at the address pointed by ptr2 also
i2 = *ptr2; //value at the address pointed by the ptr2 stored in integer variable i2

答案 3 :(得分:0)

您正在åšçš„是在ptr1的地å€ä¸­å†™ä¸‹ptr2的值。è¦æƒ³è±¡ï¼šæ‚¨åœ¨ptr1中有一个箭头,上é¢å†™ç€â€œå¦‚果您需è¦å€¼1,您å¯ä»¥æ­£ç¡®é‚£é‡Œâ€ã€‚å¤åˆ¶å®ŒæˆåŽï¼Œptr2现在还有一个箭头,上é¢å†™ç€â€œå¦‚果你需è¦value1,你å¯ä»¥æ­£ç¡®é‚£é‡Œâ€ã€‚因此,å‡è®¾ptr2指å‘值1。

,您确实是正确的

答案 4 :(得分:0)

了解C中的指针是一ç§æ–¹å¼ã€‚

指针基本上是一个å˜é‡ï¼Œå…¶å€¼ï¼ˆR值)是å¦ä¸€ä¸ªå˜é‡çš„地å€ï¼ˆL值)。

å˜é‡å…·æœ‰L值(存储它的存储器地å€ï¼‰å’ŒR值(数æ®å€¼ï¼‰ã€‚

所以

ptr2 = ptr1;

表示您将ptr2çš„R值分é…ç»™ptr1çš„R值 Ptr1çš„R值包å«i1çš„L值,所以:

cout << ptr2;  /* print i1's L-value (a memory address) */
cout << *ptr2; /* print 1, that is i1's R-value */