专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C语言指针作为参数和返回值

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/17 11:54:15       共计:3616 浏览
C 语言本质上是传值调用(call by value)的语言,因为函数的形参都是局部变量,它们通过传入的实参进行初始化。

C 语言的优点是,只要表达式的类型适当,就可以当作实参。另一方面,缺点是在启用函数时,如需要复制大数据对象,则运行成本很高。而且,函数没有办法修改原始变量(调用者的变量),只能修改原始变量的复制版本。

然而,如果函数的实参是变量的地址,那么函数就可以通过指针,直接获取该原始变量,并修改原始变量的值。所以,C 语言也提供了传址调用(call by reference)函数。

一个典型的例子就是标准函数 scanf(),它从标准输入流中读入数据,然后将结果放在它的变量中,该变量由调用者提供的指针参数所引用:
int var;
scanf( "%d", &var );

该函数调用会将字符串当作十进制数读入,然后转换为整数,再将它的值存储在局部变量 var 的内存地址上。

下面的函数 initNode()初始化一个结构变量。调用者将该结构的地址当作参数来传递。
#include <string.h>                    // 包含了memset() 和 strcpy()的原型
struct Node { long key;
              char name[32];
              /* ... 更多结构化的成员 ... */
              struct Node *next;
           };
void initNode( struct Node *pNode )     // 初始化*pNode结构
{
  memset( pNode, 0, sizeof(*pNode) );
  strcpy( pNode->name, "XXXXX" );
}

即使函数只需要读取变量的值,而不需要修改变量,传递变量地址仍然在许多时候更为高效。这是因为传递地址可以避免复制数据,只有变量地址会被推入栈中。

如果函数不修改变量,那么应该将对应的参数声明成只读指针,如下面的例子所示:
void printNode( const struct Node *pNode );
{
  printf( "Key: %ld\n", pNode->key );
  printf( "Name: %s\n", pNode->name );
  /* ... */
}

当在调用函数时把数组名作为参数,那么也是在进行“传址调用”,因为数组名会自动地被转换为指向数组内第一个元素的指针。

通常情况下,函数需要返回指针,如下例函数 mkNode()。该函数动态地建立一个新的 Node 对象,并将其地址传递给调用者:
#include <stdlib.h>
struct Node *mkNode()
{
  struct Node *pNode = malloc( sizeof(struct Node) );
  if ( pNode != NULL )
    initNode( pNode );
  return pNode;
}

如果无法为新的 Node 对象分配存储空间,则函数 mkNode()会返回一个空指针。返回指针的函数通常采用返回空指针来表示失败。例如,一个搜索函数,如果找到了满足条件的对象,则返回该对象的地址,如果没有找到满足条件的对象,则返回空指针。
版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:字符数组和字符串的区别,C语言字符数组和字符串区别详解 | ·下一条:数组指针和指针数组的区别,C语言数组指针和指针数组区别详解

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有