int *tomato(int *a, int *b) {
int *foo = (int*)malloc(sizeof(int));
*foo = *a + *b;
return foo;
}
在æ¤å‡½æ•°ä¸ï¼Œæˆ‘有foo分é…åœ¨å †ä¸å¹¶è¿”回指å‘int
的指针,但是函数å‚æ•°ä¸çš„指针*a
和*b
也分é…åœ¨å †ä¸å—?我在这里有点困惑,通常情况下,å‚æ•°æ˜¯åœ¨å †æ ˆä¸åˆ†é…的。
ç”案 0 :(得分:3)
指针是tomato
函数ä¸çš„局部å˜é‡ï¼Œå°±åƒfoo
ä¸€æ ·ã€‚
它们指å‘的值å¯ä»¥åˆ†é…在任何地方。例如,您å¯ä»¥è¿™æ ·ç§°å‘¼å®ƒï¼š
int foo = 1;
int *bar = malloc(sizeof(int));
*bar = 3;
int *result = tomato(&foo, bar);
a
将指å‘foo
å˜é‡ï¼Œè€Œb
将指å‘ç”±malloc
分é…的内å˜ã€‚
ç”案 1 :(得分:1)
Cä¸çš„å‚æ•°ä¸ä¸€å®šåœ¨å †æ ˆï¼ˆ*)ä¸åˆ†é…,但是它们的作用域必须é™åˆ¶åœ¨tomato
功能å—ä¸ï¼Œå¹¶ä¸”å¿…é¡»ä¼ é€’æŒ‰å€¼ã€‚
在分é…a
ä¸å–消引用b
和*foo = *a + *b
时,您将指针a
å’Œb
ä¸å˜å‚¨çš„内å˜åœ°å€è§£é‡Šä¸ºæ•´æ•°ï¼Œæ±‚和它们,然åŽå°†ç»“果写到指针foo
ä¸å˜å‚¨çš„内å˜åœ°å€ä¸ï¼ˆåœ¨æ‚¨çš„示例ä¸ï¼Œè¯¥åœ°å€æ°å¥½åœ¨å †ä¸ï¼‰ã€‚
分é…åŽï¼Œå¯ä»¥é€šè¿‡ä¸ºå®ƒä»¬åˆ†é…ä¸åŒçš„内å˜åœ°å€ï¼ˆå³æŒ‡é’ˆï¼‰æ¥éšæ„更改a
å’Œb
,并且由于它们的范围是é™äºŽåŠŸèƒ½å—(例如a = foo
)。但是,如果您更改了它们所引用的内å˜å†…容(例如*a = 0
),则将在函数范围之外看到,就åƒæ‚¨åœ¨å…¶ä»–地方分é…的内å˜ç©ºé—´ï¼ˆå †æ ˆæˆ–å †ï¼‰ä¸Šå†™å…¥ä¸€æ ·ã€‚ / p>
(*)å‚æ•°å¯èƒ½ä¸ä¼šåœ¨å†…å˜ï¼ˆå³å †æ ˆï¼‰ä¸ä¼ é€’ç»™å‡½æ•°ã€‚æ ¹æ®ç¼–译器/体系结构,它们å¯ä»¥ç›´æŽ¥åˆ†é…给处ç†å™¨å¯„å˜å™¨ã€‚æ— è®ºå“ªç§æ–¹å¼ï¼Œè¿™éƒ½æ˜¯é€æ˜Žçš„编译器优化,您ä¸å¿…担心……å‚数的行为将完全相åŒã€‚