有指针 Vs 没有指针
1)我们可以直接将局部变量引用(地址)传递给新函数来处理和更新值,而不是将值发送给函数并从函数返回值。
带指针
...
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
...