计算机中所有的数据都必须放在内存中,为了正确地访问这些数据,必须为每个字节都编上号码,我们将内存中自己的编号称为地址或
指针
。
![](https://img-blog.csdnimg.cn/ce47988551994519941f08a05ec9b2b7.png)
如图,为4G 内存中每个字节的编号(以十六进制表示)。
定义:
数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
先看一下如何输出一个地址:
#include<stdio.h>
int main()
{
int a=100;
char str[20]="c.biancheng.net";
printf("%#X,%#X",&a,str);
return 0;
}
运行结果如下:
%#X 表示以十六进制形式输出,并附带前缀 0X。a 是一个变量,用来存放整数,需要在前面加&来获得它的地址;str 本身就表示字符串的首地址,不需要加&。
假设变量c存储了字符‘k’,地址为0x11A,另有一个指针变量p,值为0x11A,这时
我们就称 p 指向了 c,或者说 p 是指向变量 c 的指针。
![](https://img-blog.csdnimg.cn/a06c296fa00c476194767c1b4182055f.png)
指针变量和普通变量一样,可以被多次写入:
#include<stdio.h>
int main()
{
float a=99.5,b=10.6;
char c='@',d='#';
float *p1=&a;
char *p2=&c;
printf("%#X,%#X\n",p1,p2);
p1=&b;
p2=&d;
printf("%#X,%#X\n",p1,p2);
return 0;
}
运行结果如下:
假设变量 a、b、c、d 的地址分别为 0X1000、0X1004、0X2000、0X2004,下面的示意图很好地反映了 p1、p2 指向的变化:
注意:
以上述程序为例,*是一个特殊符号,表明一个变量是指针变量,定义一个指针变量时必须带上,而后续的赋值中则不能带,若带上了就表示给指针所指地址上的值赋值,同理若在输出时带上*,则输出的是数值而不再是地址。
如下:
#include<stdio.h>
int main()
{
int a=15,b=16;
int *p=&a;
printf("%d,%d\n",a,*p);
*p=b;
printf("%d,%d\n",a,*p);
return 0;
}
运行结果如下:
同时也说明了指针可以获取内存上的数据。
除此之外,指针还可以修改内存上的数据:
#include<stdio.h>
int main()
{
int a=15,b=99,c=222;
int *p=&a;
*p=b;
c=*p;
printf("%d,%d,%d,%d\n",a,b,c,*p);
return 0;
}
运行结果如下:
所以,指针即地址,但它的作用又不局限于地址。