2016-10-19 19 views
2

変数が外部関数で定義されている場合、変数を内部関数で使用できますか?または私は配列になる3番目のパラメータを取るために内側のループを変更する必要がありますか?内部関数は、親関数で定義された変数を使用できますか?

私が尋ねているコードの例?

perm_rec1 (int nr_value , int N) 
{ 
    int array[]; 
    secondFunction(int nr_value, int N) 
} 

内部機能:

secondFunction (int nr_value, int N) 
{ 
    int temp = array; //is This possible? Or third parameter? 

} 
+0

配列でサイズで、はい、あなたは* ' – LPs

+1

' intとして関数に渡すことができますあなたは合格する必要がありsecondFunctionがどこか他の場所から呼び出された場合、どうなるでしょうか?それはうまくいかないので、あなたが呼び出し関数から変数にアクセスすることができれば危険です(コードを読みにくくすることは言うまでもありません)。 – Mogzol

答えて

6

変数が外部関数で定義されていれば、変数を内部関数で使用できますか?

Cにはネストされた機能がありません。ネストされた機能は「内部」と「外部」の指定が意味を成す唯一の意味です。あなたの例のように、ある関数が別の関数を呼び出すと、というという呼び出しが、呼び出された関数ではなく最初の関数の内部にあります。

いずれの場合でも、ブロックスコープで宣言された変数は、宣言しているブロックのレキシカルエクステントの残りの部分でのみ表示されます。それらはブロック内から呼び出された関数の本体には表示されません。同じ関数であっても、再帰的に呼び出されたものではありません。

内側のループを変更して配列になる3番目のパラメータを変更する必要がありますか?

最も自然な実装は、関数にその関数の配列の最初の要素へのポインタを与える第3のパラメータを与えることです。

4

は、ここには、内部の機能がありません(でもCにあります)。あなたが持っているものは、別のものを呼び出す関数です。呼び出し側で明示的にパラメーターとして渡す場合を除いて、呼び出し側で定義されたものにアクセスすることはできません。

1

内側のブロックで宣言された変数は、外側の変数宣言をシャドウします。

{ 
int a = 6; 
    { 
    int a = 9; 
    // won't affect the outer declaration 
    } 
// value of a = 6 here 
} 

しかし、あなたはCに内的な機能はありません。中括弧で囲んだ内部ブロックしか定義できません。

2

技術的に言えば、実際には親変数のスタックフレームにアクセスするためにローカル変数を誤用する可能性があります。しかし、これは非常に非常に醜い解決策であり、プラットフォームに依存しません。それで、パラメータとして渡してください。

2

あなたが必要なものの解釈、あなたがそれを行うためにポインタを使用することができます。

#include <stdio.h> 

void test (int *pointer, size_t size) 
{ 
    for (size_t i=0; i<size; i++) 
    { 
     printf("array[%zu] = %d\n", i, *pointer++); 
    } 
} 

int main(void) { 

    int array[] = { 1, 2, 3, 4, 5}; 

    test(array, sizeof(array)/sizeof(array[0])); 

    return 0; 
} 
関連する問題