C语言的指针

本文详细介绍了C语言中指针变量的声明、赋值方法,并探讨了指针作为函数参数的应用场景,包括改变变量值、传递大量数据以及使用const修饰指针防止修改所指对象。此外,还展示了指针作为函数返回值的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针是C语言最重要的特性之一。字节是大多数的现代计算机的基本存储单元,每个字节可存储8位的信息,都有唯一的地址。程序中的每个存储单元占用一个或多个字节,将第一个字节的地址成为该存储单元的地址,也就是指针。用以存储地址的变量称为指针变量。指针变量p存储某存储单元(变量i)的地址时,称作该p指向i

指针变量的声明

声明一个指向某一类型对象的指针变量的格式如下:

类型名 *指针变量名;

类型名没有限制。

指针变量的赋值

取地址运算符(&)用以获取变量的地址,间接寻址运算符(*)访问指针变量指向的对象。不要把间接取值运算符用于未初始化的指针变量,因为此时该指针变量未定义,可能指向内存中的任何地方。

同其他类型的变量一样,指针变量也可以被赋值,但值必须是相同类型的指针。当把指针变量赋给另一个指针变量时,则这两个指针变量指同一个存储单元。任意数量的指针变量可以指向同一个内存单元。

/**************************************
 * pointer_1.c                        *
 *                                    *
 * C语言中指针变量的声明和赋值        *
 **************************************/

#include <stdio.h>

int main()
{
  int i, *p, *q;

  i = 10;
  p = &i;
  q = p;

  printf("i的地址为%p\n", &i);
  printf("p的值为%p\n", p);
  printf("i的值为%d\n", i);
  printf("p指向的变量的值为%d\n", *p);
  printf("q的值为%p\n", q);
  printf("q指向的变量的值为%d\n", *q);

  return 0;
}

指针声明和赋值

指针作为函数的参数

使用指针作为函数的参数,在调用函数时传入变量的指针,可在函数内改变变量的值。

通常,编译器都会提供检测参数类型,保证为指针变量传入正确的值。但scanf函数通常不会检查传递指针失败,容易造成错误。

/**************************************
 * pointer_2.c                        *
 *                                    *
 * C语言中的指针作为函数参数          *
 **************************************/
#include <stdio.h>

void decompose(float x, int *int_part, float *frac_part)
{
  *int_part = (int)x;
  *frac_part = x - *int_part;
}

int main()
{
  float x = 0.0f;
  printf("输入一个浮点数:");
  scanf("%f", &x);

  int int_part = 0;
  float frac_part = 0.0f;
  decompose(x, &int_part, &frac_part);

  printf("%g的整数部分为%d,小数部分为%g\n", x, int_part, frac_part);

  return 0;
}

指针做参数
指针作为函数参数除了可以在函数内改变变量的值外,还有一个原因是需要传给函数的值可能需要很大的存储空间,利用值传递需要进行赋值花费很大的时间和空间,因此可以传入指针直接访问变量。可以通过const标识符修饰函数定义中的指针变量,声明函数不能改变传入的指针指向的对象。若试图改变,则会报错。

/***************************************
 * pointer_3.c                         *
 *                                     *
 * C语言中const修饰的指针形式变量不能  *
 * 修改指向的变量                      *
 ***************************************/
#include <stdio.h>

void f(const int *p)
{
  *p = 10;
}
int main()
{
  int i = 0;
  f(&i);
  printf("i = %d\n", i);

  return 0;
}

const指针变量不能修改指向变量的值

指针作为返回值

返回的指针变量要么是通过实际参数传入的指针,或者是实际参数传入的数组或数组的某一个元素,也或者是执行外部变量或声明为static的局部变量等,但不能返回执行函数内部局部变量的指针,因为当函数返回该变量的内存空间就被释放了,指向改变了的指针就无效了。

/**************************************
 * pointer_4.c                        *
 *                                    *
 * C语言的指针作为返回值              *
 **************************************/
#include <stdio.h>

int *max(int *a, int *b)
{
  if (*a > *b)
    return a;
  else
    return b;
}

int main()
{
  int a = 0;
  int b = 0;
  printf("请输入两个整数:");
  scanf("%d%d", &a, &b);

  printf("%d和%d中较大的一个数为%d\n", a, b, *max(&a, &b));

  return 0;
}

指针作为返回变量

参考文献

  1. K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值