C语言的核心技术:指针系列

2020-05-04  本文已影响0人  KangSmit的算法那些事儿

一个C程序的使用永远不能忽略指针,下面先从地址开始介绍。
参考资料的部分内容来源:《C语言从入门到精通》
需要领取书籍可关注我的微信公众号:kangsinx
点击这里进入微信公众号文章末尾扫码关注

1、地址

系统的内存就好比是带有编号的小房间,如果想使用内存就需要得到房间编号。下图定义了一个整型变量i,整型变量需要4个字节,所以编译器为变量i分配的编号为1000~1003。

image.png

什么是地址?地址就是内存区中对每个字节的编号,上图所示的1000、1001、1002、1003就是地址。

下图所示的1000、1004等就是内存单元的地址,而0、1就是内存单元的内容,换种说法就是基本整型变量i在内存中的地址,并且该地址从1000开始。由于基本整型占4个字节,所以变量j在内存中的起始地址为1004,变量i的内容是0。

image.png

从上面知道地址和变量是有区别的,并且地址的编号与变量类型的字节大小有关。

2、指针

那么指针又是什么呢?这里仅将指针看做是内存中的一个地址,多数情况下,这个地址是内存中另一个变量的位置,如下图所示。在程序中定义了一个变量,在进行编译时就会给该变量在内存中分配一个地址,通过访问这个地址可以找到所需的变量,这个变量的地址称为该变量的“指针”。下图所示的地址1000是变量i的指针。

image.png

变量的地址是变量和指针二者之间连接的纽带,如果一个变量包含了另一个变量的地址,则可以理解成第1个变量指向第2个变量。所谓“指向”就是通过地址来体现的。因为指针变量是指向一个变量的地址,所以将一个变量的地址值赋给这个指针变量后,这个指针变量就“指向”了该变量。例如,将变量i的地址存放到指针变量p中,p就指向i,其关系如下图所示。

image.png

如果你觉得上面的论述不好理解,那么这里再提供一个论述:

假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示)。另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们就称 p 指向了 c,或者说 p 是指向变量 c 的指针。

image

数学理解:已知*p=11A,&c=11A,那么就称 p 指向了 c,或者说 p 是指向变量 c 的指针,即 *p=&c。

综上所述,指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

更好的理解:如果有一个变量专门用来存放另一个变量的地址,它就是指针变量。例如上面的变量p就是指针变量。

3、指针变量的使用

(1)指针变量的一般形式

如果一个变量包含指针(指针等同于一个变量的地址),则必须对它进行说明。定义指针变量的一般形式如下:

类型说明 * 变量名

其中,“*”表示该变量是一个指针变量,变量名即为定义的指针变量名,类型说明表示本指针变量所指向的变量的数据类型。

(2)指针变量的赋值

指针变量同普通变量一样,使用之前不仅需要定义,而且必须赋予具体的值。未经赋值的指针变量不能使用。

“给指针变量所赋的值与给其他变量所赋的值不同,给指针变量的赋值只能赋予地址,而不能赋予任何其他数据,否则将引起错误。”

C语言中提供了地址运算符“&”来表示变量的地址。其一般形式为: & 变量名; 如&a表示变量a的地址,&b表示变量b的地址。给一个指针变量赋值可以有以下两种方法。

(1.1) 、定义指针变量的同时就进行赋值:

 int a;
 int *p=&a; 

(1.2)、先定义指针变量之后再赋值:

 int a;
 int *p; 
p=&a;

下面来看一个例子:
从任意输入两个数,使用指针的方法将这两个数输出。

#include<stdio.h>
main()
{
    int a, b;
    int *ipointer1,  *ipointer2;/*声明两个指针变量*/
    printf("请输入两个数:\n") ;
    scanf("%d%d", &a, &b);/*输入两个数*/  //小心,在 %d%d中间加逗号会影响结果 
    ipointer1 = &a;
    ipointer2 = &b;     /*将地址赋给指针变量*/
    printf("这两个数为:%d,%d\n", *ipointer1, *ipointer2);
}

执行结果:


image.png
(3)指针变量的引用

引用指针变量是对变量进行间接访问的一种形式。对指针变量的引用形式如:

*指针变量

其含义是引用指针变量所指向的值。例如:

#include<stdio.h>
main( )
{
     int *p,q;
     printf("请输入一个数:\n");
     scanf("%d",&q);    /*输入一个整型数据*/
     p = &q;
     printf("这个数为:\n");
     printf("%d\n",*p); /*输出变量的值*/
}

执行结果:

image.png
(4)“&”和“*”运算符

在前面介绍指针变量的过程中用到了“&”和“*”两个运算符:

image.png

运算符“&”是一个返回操作数地址的单目运算符,叫作取地址运算符,例如:
p=&i;就是将变量i的内存地址赋给p,这个地址是该变量在计算机内部的存储位置。

运算符 “ * ” 是单目运算符,叫作指针运算符,作用是返回指定的地址内的变量的值,例如前面提到过p中装有变量i的内存地址,则:
q=*p;就是将变量i的值赋给q,假如变量i的值是5,则q的值也是5。

上一篇下一篇

猜你喜欢

热点阅读