我希望我知道“安全”在这里应该是什么意思(我看到你的评论说你是从面试中得到的,而且面试官没有解释他的意思)。
函数应该接收指针作为参数的原因只有 4 个:
- 该函数旨在更新参数;
- 参数为数组表达式,作为函数参数传递时会自动转换为指针表达式;
- 该参数是一个非常大
struct
或类似的聚合类型,创建本地副本被认为过于昂贵;
- 该参数是通过
malloc
、calloc
或创建的realloc
。
这些都不应该适用于您发布的片段。对他们来说“最安全”的选择是根本不使用指针。
使用指针的一个“不安全”方面是您可能打算将输入设为只读,但由于您已收到指针,因此您可以修改输入。对于这些情况,您希望const
-qualify 该参数:
void foo ( const char *str ) // we cannot modify what str points to
{
...
}
使用指针的另一个“不安全”方面是意外(或故意)更新指针值本身以访问您不应该访问的内存:
while ( *ptr )
do_something_with( ptr++ );
您可以通过将指针声明为const
:
void bar( int * const ptr ) // we cannot update the value in ptr
但是,这不会阻止您使用[]
下标运算符:
while( ptr[i] )
do_something_with( ptr[i++] );
现在,如果你的面试官正在考虑多个线程或一些与中断或波动有关的机器级问题,那么也许他有一个观点——如果有什么东西可以修改ptr
指向当前执行线程控制之外的东西,那么是的,第二种方法在这方面“更安全”(指向的值在计算过程中不会改变)。
但是,如果代码是多线程的并且ptr
可以在不同的线程中进行修改,那么对它的访问应该通过互斥锁或其他东西进行同步。如果ptr
可以在您的程序控制之外进行更新,则应该声明它volatile
:
int power1( volatile int *ptr ) { ... }
int power2( volatile int *ptr ) { ... }