将指针作为å‚数传递

时间:2019-04-24 21:31:25

标签: c pointers stack heap

int *tomato(int *a, int *b) {
    int *foo = (int*)malloc(sizeof(int));
    *foo = *a + *b;
    return foo;
}

在此函数中,我有foo分é…在堆中并返回指å‘int的指针,但是函数å‚数中的指针*aå’Œ*b也分é…在堆中å—?我在这里有点困惑,通常情况下,å‚数是在堆栈中分é…的。

2 个答案:

答案 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>

(*)å‚æ•°å¯èƒ½ä¸ä¼šåœ¨å†…存(å³å †æ ˆï¼‰ä¸­ä¼ é€’给函数。根æ®ç¼–译器/体系结构,它们å¯ä»¥ç›´æŽ¥åˆ†é…给处ç†å™¨å¯„存器。无论哪ç§æ–¹å¼ï¼Œè¿™éƒ½æ˜¯é€æ˜Žçš„编译器优化,您ä¸å¿…担心……å‚数的行为将完全相åŒã€‚