4月从零学习C语言(第18天)——指针

443 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

昨天我们取得了变量的地址如果我们将这个地址传递给一个函数那么能不能通过这个地址在函数内访问这个变量呢?

答案可定是可以的。那么我们只需要将这个地址放到指针当中就可以实现啦。

指针

指针也就是内存地址,指针变量是用来存放内存地址的变量。

声明指针:

type *var_name;

type 是指针的基类型,它必须是一个有效的 C语言 数据类型,var_name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。下面就是我们声明的指针变量:

int* p = &i;
int* p,q;
int *p,q;

注意:

我们在声明指针变量的时候可以把*号挨着int也就是指针变量的类型,也可以按着p(指针变量的名称)。 在上面我们的第二行和第三行都是之只声明了一个叫做p的指针变量,而后面的q是一个普通的int类型的变量。

指针变量

变量的值是内存的地址

  • 普通变量的值是实际的值
  • 指针变量的值是具有实际值的变量的地址

image.png

作为参数的指针

void f(int *p);

在被调用的时候得到了某个变量的地址:

int i=0; f(&i);

在函数里面可以通过这个指针访问外面的这个i

#include <stdio.h>

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

void f(int *p){
  printf("p=%p\n",p);
}

结果:

image.png

在这里我们可以看到我们的p指针变量储存的值是我们i变量的地址。

访问那个地址上的变量*

那么我们会想既然指针变量放的是我们变量的地址我们该如何通过这个地址访问地址上的变量的值呢? 这里我们只要使用*运算符就可以实现。

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

当我们拿到这个变量的值之后这个值既可以做右值也可以做左值

#include <stdio.h>

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

void f(int *p){
  printf("p=%p\n",p);
  printf("*p=%d\n",*p);
  *p=26;
}

运行结果:

image.png

在上面我们可以看到我们通过printf("*p=%d\n",*p);中的*p来访问了i变量的值,然后我们又通过*p=26修改了i变量储存的值。

左值之所以叫左值

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

a[0] = 2;//在这里的a[0]是值而不是变量
*p = 3;//在这里的*p是值而不是变量

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

指针的运算符&*

互相反作用

&yptr ->(&yptr) ->*(yptr的地址)->得到那个地址上的变量-> yptr

&*yptr ->&(*yptr) ->&(y) ->得到y的地址,也就是yptr -> yptr

总结

我们可以把指针看作房间的电子钥匙这个电子钥匙当中储存着这个房间的信息。我们可以通过这把钥匙打开房门修改房间里储存的东西,也可以通过这把钥匙找到房间的地址。