一、地址和指针的概念
1、地址
(1)计算机硬件系统的内部存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理, 必 须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。
内存地址──内存中存储单元的编号。
(2)在地址所标识的存储单元中存放数据。
注意:
内存单元的地址与内存单元中的数据是两个完全不同的概念。
变量地址──系统分配给变量的内存单元的起始地址。
2、指针的概念
在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单 元,不同的数据类型所占用的内存单元数不等,如整型量占4个单元,字符量占1个单元等,为了 正确地访问这些内存单元,必须为每个内存单元编上号。
根据一个内存单元的编号即可准确地 找 到该内存单元。 内存单元的编号也叫做指针。既然根据内存单元的编号或地址就可以找到 所需的内存单元,所以通畅也把这个地址称为指针。
内存单元的指针和内存单元的内容是两个不同的概念。
总结:对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的
二、指针变量
1、指针变量的概念
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。
因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
注意:
严格意义上说,指针是一个地址,是一个常量。
指针变量是存放一个地址,是一个变量。
2、定义一个指针变量
指针变量的定义包括三个内容:
(1)指针类型说明,即定义变量为一个指针变量;
(2)指针变量名;
(3)变量值(指针);
一般形式为:
//类型说明符 *变量名;
*表示这是一个指针变量;
变量名即为定义的指针变量名;
类型说明符表示本指针变量所指 向的变量的数据类型。
//定义int类型的指针变量
//定义了一个指针变量,变量名是p1
//int表示,p1只能存放一个int类型的变量的地址
int *p1;
//定义char类型的指针变量
//定义了一个指针变量,变量名是p2
//char表示,p2只能存放一个char类型的变量的地址
char *p2;
//定义double类型的指针变量
double *p3;
//定义float类型的指针变量
float *p4;
//定义void类型的指针变量
void *p5;
注意:
(1)在定义指针时,“*”号表示定义的变量是指针变量,变量的值只能存放地址。
(2)一个类型的指针只能指向同类型的变量,不能指向其他类型的变量。
(3)指针也可以被声明为全局、静态局部和局部的。
3、指针变量的初始化和引用
(1)定义的同时进行初始化
int *p = &a; //用a的地址初始化 p这个指针变量
//p指向了a
int *p1 = &a,*p2 = &a; //p1 p2都指向了a
//部分初始化
//定义了两个指针变量 p3 p4
int *p3 = &b,*p4;
p4 = &b;
(2)先定义后初始化
int *p7;
p7 = NULL;
(3)把指针初始化为 NULL
int *p5 = NULL; //NULL 是空(0)
int *p6 = 0; //空
(4)不合法的初始化
①指针变量不能被赋值一个整数值,因为我们不知道这个整形常量是内存哪块地址,如:
int *p;
p = 1000;
②被赋值的指针变量前不能再加“*”说明符,如:
*p = &a;//错误写法