一个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。
网友评论