こんにちは静的ポインタと外部ポインタの使用方法は何ですか?彼らはCでの外部ポインタと静的ポインタ
答えて
は、それらを使用することができるときについてあなたの質問に答えるために、簡単な例をいくつ:
静的ポインタがそれを最初に割り当て、常にプログラムに同じバッファを返す関数を実装するために使用することができそれが呼び出されます。
char * GetBuffer() {
static char * buff = 0;
if (buff == 0) {
buff = malloc(BUFSIZE);
}
return buff;
}
にextern(つまりグローバル)ポインタがメインのパラメータにアクセスするには、他のコンパイル単位を可能にするために使用することができます
extern int ArgC = 0;
extern char ** ArgV = 0;
int main(int argc, char ** argv) {
ArgC = argc;
ArgV = argv;
...
}
は基本的にHow to correctly use the extern keyword in C
そしてInternal static variables in C, would you use them?
を参照してください。存在する場合(標準Cで)、「静的」機能で使用された場合、それは通常、一度機能の終了と同じように、変数が一掃されていないことができます(つまり、関数が呼び出されるたびに古い値が保持されます)。 "Extern"は、変数のスコープを拡大して他のファイルで使用できるようにします(つまり、グローバル変数にします)。
短答。 スタティックは永続的なので、関数で宣言すると、関数を再度呼び出すと、前回と同じ値になります。グローバルに宣言すると、そのファイル内ではグローバルのみになります。
Externは、グローバルに宣言されていますが、別のファイルに宣言されています。 (これは基本的にこの変数が存在することを意味し、これはその変数が定義するものです)。
短い答え:それらは存在しません。 C99 6.7.1では、「宣言の宣言指定子には、せいぜい1つのストレージクラス指定子を与えることができます」と記載されています。 extern
とstatic
はどちらもストレージクラス指定子です。
それは疑問の驚くべき解釈に答えています。私は質問が意味することを期待する:静的ポインタの使用は何ですか、そしてexternポインタの使用は何ですか(私は両方が存在することを知っているので、私はその資格を無視します)。 –
複数の翻訳単位でグローバルに使用できるようにするポインタがあるとします。私はにを1箇所(foo.c)で定義したいが、他の翻訳単位では複数の宣言を許可する。 "extern"キーワードは、これがオブジェクトのを定義するではないことをコンパイラに知らせます。実際の定義は他の場所に表示されます。これは、オブジェクト名をリンカーが利用できるようにするだけです。コードがコンパイルされてリンクされると、異なる翻訳単位はすべて、その名前で同じオブジェクトを参照します。
私は、1つのソースファイル内の関数でグローバルに使用できるようにしたいが、他の翻訳単位では見えないようにするポインタもあるとします。私は "静的"キーワードを使用して、オブジェクトの名前がリンカーにエクスポートされないことを示すことができます。
私は1つの関数内でのみ使用したいポインタを持っていますが、そのポインタの値は関数呼び出しの間に保存されているとします。 "static"キーワードを使用して、オブジェクトに静的エクステントがあることを示すことができます。そのメモリはプログラムの起動時に割り当てられ、プログラムが終了するまで解放されないので、オブジェクトの値は関数呼び出しの間に保持されます。
/**
* foo.h
*/
#ifndef FOO_H
#define FOO_H
/**
* Non-defining declaration of aGlobalPointer; makes the name available
* to other translation units, but does not allocate the pointer object
* itself.
*/
extern int *aGlobalPointer;
/**
* A function that uses all three pointers (extern on a function
* declaration serves roughly the same purpose as on a variable declaration)
*/
extern void demoPointers(void);
...
#endif
/**
* foo.c
*/
#include "foo.h"
/**
* Defining declaration for aGlobalPointer. Since the declaration
* appears at file scope (outside of any function) it will have static
* extent (memory for it will be allocated at program start and released
* at program end), and the name will be exported to the linker.
*/
int *aGlobalPointer;
/**
* Defining declaration for aLocalPointer. Like aGlobalPointer, it has
* static extent, but the presence of the "static" keyword prevents
* the name from being exported to the linker.
*/
static int *aLocalPointer;
void demoPointers(void)
{
/**
* The static keyword indicates that aReallyLocalPointer has static extent,
* so the memory for it will not be released when the function exits,
* even though it is not accessible outside of this function definition
* (at least not by name)
*/
static int *aReallyLocalPointer;
}
- 1. ダイナミックアレイ用C静的ポインタ
- 2. 静的ポインタは強いポインタですか?
- 3. 関数へのC++静的ポインタ
- 4. 静的ポインタを持つC++クラス
- 5. C++ - テンプレートクラス - >静的関数 - >静的関数ポインタのリンクエラー
- 6. この静的オブジェクトのポインタ
- 7. ポインタと静的オブジェクトと新しいオブジェクト
- 8. 静的CライブラリのポインタにC#配列をマーシャリングする
- 9. C++ポインタへのポインタ
- 10. サンプルコードのAVFoundation.Frameworkの静的voidポインタ
- 11. テンプレートクラスの静的メソッドの関数ポインタ
- 12. クラス非静的メソッドグローバル関数へのポインタ
- 13. 静的配列へのポインタをコピー
- 14. 参照先/静的ローカル変数のポインタ
- 15. 関数ポインタへの静的マップ
- 16. ポインタとC/C++でのキャスト
- 17. C、ポインタ(またはポインタへのポインタ?)、**、malloc
- 18. C++ - 静的なcharポインタの配列を初期化する
- 19. C++のポインタ - 紛争宣言とへのポインタのポインタ
- 20. C++のポインタへのポインタ
- 21. Objective-Cのポインタへのポインタ
- 22. C:へのポインタのポインタ
- 23. 静的intポインタに対する引数
- 24. 目的地Cのアドレッシングとポインタ
- 25. cポインタとctype
- 26. Cリンクリストスタックとポインタ
- 27. C++ポインタへのポインタのポインタへのポインタのコピー
- 28. performBlockの外部のNSManagedObjectへのポインタ
- 29. 静的メソッドから静的関数ポインタを呼び出す
- 30. C++静的関数ポインタを呼び出す
なぜbuffがcharですか? intではありませんでしたか? – tetris
これは例なのでcharです。それはint、double、yada yadaかもしれない。 –