C语言程序设计(19)

60 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
访问那个地址上的变量*

*是一个单目运算符,用来访问指针的值所表示的地址上的变量;

可以做右值也可以做左值;

int k=*p; *p=k;

为什么在左边叫左值

是因为出现在赋值号左边的不是变量,而是值,是表达式计算的结果;

a[0]=2;

*p=3;

是特殊的值,所以叫左值。

指针的运算符&、*

互相反作用

*&a->a;

&*a->a。

指针应用场景一

交换两个变量的值

void swap(int *pa,int *pb)
{
    int t=*pa;
    *pa=*pb;
    *pb=t;
}

指针的用处为如果函数里用单纯的int整形,则只能在swap中起作用,出来swap就无作用了。

指针应用场景二

函数返回多个值,某些值只可以通过指针返回,传入的参数实际上是需要保存带回结果的变量。

函数返回运算的状态,结果通过指针返回:常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错(-1或0)。

若任何数值都是有效的可能结果时,要分开返回。

return来返回状态,值用指针参数。

指针最常见的错误

定义了指针变量,还没有指向任何变量,就开始使用指针。

传入副函数的数组成了什么

函数参数表中的数组实际上为指针

sizeof(a)==sizeof(int *)

但是可用数组运算符[]进行计算。

在函数数组中,以下四种函数原型是等价的

int sum(int *ar,int n);

int sum(int *,int);

int sum(int ar[],int n);

int sum(int[],int);

数组变量是特殊的指针

数组变量本身表达地址(int a[10];int *p=a; // 无需&)

但是数组的单元表达的是变量,需要用&取地址(a==&a[0])

[]运算符可以对数组做,也可以对指针做。