指针究竟是什么?

·  阅读 62

一图胜千言

  1. 声明变量:C语言声明一个变量时,编译器在内存中留出一个唯一的地址单元来存储变量,如下图,变量var初始化为100,编译器将地址为1004的内存单元留给变量,并将地址1004和该变量的名称关联起来。

2.创建指针:变量var的地址是1004,是一个数字,地址的这个数字可以用另一个变量来保存它,假设这个变量为p,此时变量p未被初始化,系统为它分配了空间,但值还不确定,如下图所示。

3.初始化指针,将变量var的地址存储到变量p中,初始化后(p=&var),p指向var,称为一个指向var的指针。指针是一个变量,它存储了另一个变量的地址。

4.声明指针:typename *p 其中typename指的是var的变量类型,可以是 short ,char ,float,因为每个类型占用的内存字节不同,short占2个字节,char占1个字节,float占4个字节,指针的值等于它指向变量的第一个字节的地址 。*是间接运算符,说明p是指针变量,与非指针变量区别开来。

  1. *p和var指的是var的内容;p和&var指的是var的地址

6.既然指针*p的值等于var,p的值等于&var,为什么要多发明这一个指针符号增加记忆量呢。 指针主要的功能有两个:避免副本和共享数据。 指针的重要功能是函数之间传递参数。 talk is cheap, show me the code! 假设用c语言设计一个游戏,控制人物向前走的函数为 go_forward(),这个函数接收游戏人物的坐标(int x,int y) 两个变量,对这两个变量进行加减操作。

#include <stdio.h>
void go_forward(int position_x,int position_y)
{
    position_x=position_x+1;
    position_y=position_y+1;
    }
    int main()
    {
    int x=0;
    int y=0;
    go_forward(x,y);
    printf("当前坐标为:%d,%d \n",x,y);
    return 0;
}
复制代码

你希望执行go_forward()函数后x,y坐标都+1,输出为(1,1),但是结果还是(0,0)原因为C语言调用函数的方式是按值传递参数,以x参数为例,刚开始main函数中有一个x的局部变量,值为0,当计算机调用go_forward()函数时,它将变量x的值复制给了参数position_x,这只是一个赋值过程将变量x赋值给变量position_x,相当于 position_x=x 命令,而这个命令,x的值是不发生变化的,结果如下图所示,x的值仍为0,position_x的值变为1。

解决方法,传递指针,用指针告诉go_forward()函数参数x的值的地址,go_forward()函数就能修改对应地址中的内容。所以用指针的主要原因是让函数共享存储器,一个函数可以修改另一个函数创建的数据,只要提供数据在内存中的地址,修改代码如下。

#include <stdio.h>
void go_foward(int *position_x,int*position_y)
{
    *position_x=*position_x+1;
    *position_y=*position_y+1;
    }
    int main()
    {
    int x=0;
    int y=0;
    go_forward(&x,&y);
    printf("当前坐标为:%d,%d \n",x,y);
    return 0;
}
复制代码

运行结果:当前坐标为:1,1

作者:fan wang
链接:www.zhihu.com/question/31…
来源:知乎

分类:
iOS
标签:
分类:
iOS
标签: