目录
一、指针与指针变量
1、地址
在计算机中,所有的数据与程序都必须被加载在内存中才能运用,c语言的数据都被存放在一个个内存单元中每个存储单元都有一个编号,而这个编号就是存储单元的地址,每个存储单元都有一个与之对应的地址数据与程序就被放在这些内存单元中。
2、指针与指针变量的介绍
内存区的每一个字节都有一个编号,这就是地址,而指针的实质就是内存地址。在c语言中,可以用一个变量来存放指针,这就是指针变量,因此,一个指针变量的值就是某个内存单元的地址,为避免混淆,我们规定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。在一个指针变量中存放一个数据的意义在于:我们可以通过访问指针变量来取得一个数据的地址,从而也就找到了该数据。
二、指针变量的定义与引用
1、变量的存取方法
通过变量名来引用变量的内存单元值的方法为直接引用,而通过内存地址来引用内存单元值的方法为间接引用。
如下:
#include<stdio.h>
main()
{
int a=2;
int *p=&a;
printf("%d\n",a);
printf("%d",*p);
}
输出结果为:
2
2
其中,第一个printf表示对a进行直接引用,第二个表示通过a的内存地址来对a进行间接引用
2、指针变量的定义
指针变量的定义格式为:
[存储类型] 数据类型符 *变量名;
其中,数据类型符指的是指针变量所指向的目标变量的数据类型,定义格式说明如下:
1、*号表明后面的变量是指针变量
2、变量必须是合法的标识符
3、存储类型是指针变量本身的存储类型
如下几种定义方式:
#include<stdio.h>
int *p1;
staic int *p2;
float *p3,a;
float a,*p3;
char *p4,*P5;
第一个定义表示p1是一个指针变量,它的只是某个整形变量的地址。第二个定义表示指针变量p2被分配在内存的静态储存区,它是静态指针变量。第三个定义中表示定义了指针变量p3和一个浮点型变量a。第四个定义表示同时定义了两个指针变量p4,和p5.
注意:在这几个例子中指针变量名是p1,p2等,而不是*p1,*p2,前面的*号只是表示这个变量是一个指针变量,*号与变量之间可以加若干个空格,如下:
#include<stdio.h>
int *p1;
int* p1;
int * p1;
这几种定义方式都是完全相同的。
3、指针变量的赋值
指针变量与其它普通变量一样,在使用之前必须定义并且赋初值,否则其指向的地址是不确定的,在对指针变量进行初始化的时候,需要将需要指向的变量的地址赋给指针变量,在c语言中可以用地址运算符&来表示变量的地址,如&p表示变量p的地址,变量初始化的一种方法为:
int a;
int *p=&a;
赋值时为指针变量赋的值必须是一个地址。当定义一个字符型的指针变量的时候就不能将一个其他类型的变量的地址赋给它。当不清楚将一个指针变量赋值为什么值的时候,可以先将它定义为一个空指针,指针变量值为0的指针为零指针(空指针),其用途有两个:一是避免指针变量的非法引用,二是在程序中作为状态比较
4、指针变量的引用
当一个指针指向一个变量的时候,程序就可以间接引用这个变量,如下:
#include<stdio.h>//用指针变量修改指向的变量的值
main()
{
int a;
int *p=&a;
*p=10;
printf("%d\n",a);
printf("%d\n",*p);
(*p)++;
printf("%d,%d",a,*p);
}
输出结果为:
10
10
11 ,11
在程序中的*号是间接引用运算符,是单目运算符,其优先级与++、--的优先级相同,右结合性。其中的(*p)++相当于a++,运用指针实现了间接对a的值进行改变