ポインタありとポインタなし
1)関数に値を送信して関数から値を返す代わりに、ローカル変数reference(address)を新しい関数に直接渡して、値を処理および更新できます。
ポインタ付き
...
int a = 10;
func(&a);
...
void func(int *x);
{
//do something with the value *x(10)
*x = 5;
}
ポインタなし
...
int a = 10;
a = func(a);
...
int func(int x);
{
//do something with the value x(10)
x = 5;
return x;
}
2)グローバル変数または静的変数には有効期間のスコープがあり、ローカル変数には関数のみのスコープがあります。ユーザー定義のスコープ変数を作成する場合は、ポインターが必要であることを意味します。つまり、いくつn
かの関数でスコープを持つ必要がある変数を作成する場合は、最初の関数でその変数のダイナミックメモリを作成し、それをすべての関数に渡し、最後にn番目の関数でメモリを解放します。
3)メンバー関数をメンバー変数と一緒に構造内に保持したい場合は、関数ポインターを使用できます。
struct data;
struct data
{
int no1, no2, ans;
void (*pfAdd)(struct data*);
void (*pfSub)(struct data*);
void (*pfMul)(struct data*);
void (*pfDiv)(struct data*);
};
void add(struct data* x)
{
x.ans = x.no1, x.no2;
}
...
struct data a;
a.no1 = 10;
a.no1 = 5;
a.pfAdd = add;
...
a.pfAdd(&a);
printf("Addition is %d\n", a.ans);
...
4)data
サイズs
が非常に大きい構造を考えてみましょう。この構造体の変数を別の関数に送信する場合は、参照として送信する方が適切です。これにより、新しい関数用に作成されたアクティベーションレコード(スタック内)のサイズが減少するためです。
ポインターあり-関数のアクティベーションレコード(スタック内)に必要なのは4バイト(32ビットm / c)または8バイト(64ビットm / c)のみです。func
...
struct data a;
func(&a);
...
ポインタなし-s
関数のアクティベーションレコード(スタック内)にバイトが必要になりますfunc
。非常に大きな価値s
があると考えてください。sizeof(struct data)
...
struct data a;
func(a);
...
5)定数変数の値をポインタで変更できます。
...
const int a = 10;
int *p = NULL;
p = (int *)&a;
*p = 5;
printf("%d", a); //This will print 5
...