无法ç†è§£æ¶‰åŠæŒ‡é’ˆçš„C程åºçš„一å°éƒ¨åˆ†

时间:2015-03-17 10:21:37

标签: c pointers memory

int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);

我能ç†è§£å‰3行。我知é“int *p = &x;表示指针p指å‘x的内存地å€ã€‚但我无法ç†è§£æŽ¥ä¸‹æ¥çš„4行代ç ã€‚此代ç çš„输出为:

 11,17

但我无法ç†è§£å¦‚何?有人å¯ä»¥å‘我解释一下。

6 个答案:

答案 0 :(得分:4)

  

指针是一个å˜é‡ï¼Œå…¶å€¼æ˜¯å¦ä¸€ä¸ªå˜é‡çš„地å€ï¼Œå³å­˜å‚¨å•å…ƒçš„直接地å€ã€‚

当您这样分é…时,

 int *p=&x;// It will point to the address of x variable. 

*p中所åšçš„任何更改,都会影å“内存。因此,当您使用x访问它时,它具有值。

 *p=x+y; // It's equivalent x=x+y;

然åŽy也是这样。

现在x的值为11。 p=&y;

  *p=x+y;// It's equivalent to y=x+y;

所以现在x的值为11,y值为5。结果是17。

答案 1 :(得分:3)

让我们é€è¡Œåˆ†æžä»£ç ï¼Œæ˜¯å—?

在进入答案之å‰ï¼Œä¸€ä¸ªå°ä¿¡æ¯*称为间接或å–消引用è¿ç®—符,用于访问值在内存地å€ã€‚

所以,根æ®ä½ çš„代ç ï¼š

  • *p = x + y;添加xå’Œy并将值存储在p 指å‘的内存ä½ç½®[å³ã€‚地å€x]。。因此,这样,x的实际值就会被修改。现在,xæŒæœ‰x+y或5+6或11。

  • p = &y;与int *p = &x;

  • 相åŒçš„逻辑
  • *p = x + y;与第一点相åŒçš„逻辑。请记ä½ï¼Œx值在第一次被修改,因此将考虑最新的x值。因此,修改åŽçš„y将为11 + 6或17。

  • printf("%d,%d", x, y);现在ä¸è¦å‘Šè¯‰æˆ‘ä½ ä¸æ˜Žç™½è¿™ä¸€è¡Œã€‚ : - )

答案 2 :(得分:1)

      *p = x + y; 

所以现在p将指å‘x的地å€ï¼Œè€Œï¼ˆ* p)将指å‘存储在x中的值。所以你在内存ä½ç½®æ”¹å˜x的值。

       p = &y;

现在您将y的地å€åˆ†é…ç»™p。

       *p = x + y;

现在使用其内存地å€æ›´æ”¹y的值。

答案 3 :(得分:0)

实际上这段代ç 

int x = 5;
int y = 6;
int *p = &x;
*p = x + y;
p = &y;
*p = x + y;
printf("%d,%d", x, y);

ä½ å¯ä»¥æ”¹å†™ä»¥ä¸‹æ–¹å¼ï¼Œè€Œä¸ä½¿ç”¨æ›´æ˜Žç¡®çš„指针

int x = 5;
int y = 6;
x = x + y;
y = x + y;
printf("%d,%d", x, y);

因此,首先x设置为x + y的总和,并且等于11,然åŽå°†y设置为更新x的总和(现在等于11)和y并且等于17。

唯一ä¸åŒçš„是,第一个代ç æ®µä¸æ˜¯ç›´æŽ¥ä½¿ç”¨xå’Œy,而是使用指针。

å› æ­¤

è¯­å¥ Â Â Â Â x = x + y; 被这两个陈述的组åˆå–代

int *p = &x;
*p = x + y;

和陈述

y = x + y;

替æ¢ä¸ºè¿™ä¸¤ä¸ªé™ˆè¿°çš„组åˆ

p = &y;
*p = x + y;

首先,指针p被赋予地å€x

int *p = &x;

并且对象(å³x)被赋予x + y

的和
*p = x + y;

对于å˜é‡y和指针pé‡å¤ç›¸åŒçš„æ“作。

答案 4 :(得分:0)

*p = x + y

å–消引用指针p,将x + y的值赋给p指å‘的内存。相当于x = x + y。 x现在等于x + y,å³5 + 6 = 11。

p = &y

å°†y的地å€åˆ†é…给指针p。指针p指å‘y的记忆,æ¢å¥è¯è¯´ã€‚

*p = x +y

å–消引用指针p,将x + y的值赋给p指å‘的内存。相当于y = x + y。 y现在等于x + y,å³11 + 6 = 17。

最åŽï¼Œx = 11,y = 17。

希望它有所帮助。

答案 5 :(得分:0)

为了更好地ç†è§£æŒ‡é’ˆå’Œç›¸å…³çš„&符å·å’Œæ˜Ÿå·ç¬¦å·ï¼Œæˆ‘建议这个基本陈述:
我们å‡è®¾ï¼š

int * p;
int x;

1)指针是一个地å€ã€‚è¿™æ„味ç€p是存储器中存储整数值的地å€
2)当使用* p时,星å·ç¬¦å·å¯ä»¥ï¼†ï¼ƒ34;翻译"作为"地å€çš„价值&#34 ;;è¿™æ„味ç€å½“我们使用* p时,我们想è¦ä¸€ä¸ªé©»ç•™åœ¨åœ°å€p中的值;
3)当使用& x时,&符å·å¯ä»¥ï¼†ï¼ƒ34;翻译"作为""的地å€;è¿™æ„味ç€æˆ‘们想è¦èŽ·å–x;

的地å€

å› æ­¤æ“作:
0)p = x;ä¸æ­£ç¡®;
1)* p = x;是正确的(如果p是有效地å€ï¼‰ï¼Œåœ°å€p的值现在与值x相åŒ;
2)p =& x;是正确的,* p == x;在这ç§æƒ…况下,您还需è¦äº†è§£ï¼Œp和& x是相åŒçš„地å€ã€‚因此,如果您更改* p或x,则å¦ä¸€ä¸ªä¹Ÿå°†å…·æœ‰ç›¸åŒçš„值。