指针是C语言中的一个重要概念,也是C语言的一个重要特色;使用指针,可以使程序简洁、紧凑、高效。不掌握指针,就没有掌握C语言的精华。
目录
一、定义
1.1地址
1.2指针
1.3指针变量
1.4指针和指针变量的区别
二、使用指针变量的实例
2.1程序分析
2.2带(*)号的解释
2.3引用指针变量的3种情况
我们先来看一副图,带着你的疑问往下看。
变量i,j,k,j_pointer大小均为4个字节(不同编译器和操作系统大小可能不一样)
计算机内存的最小单位是:位(Bit),基本单位是:字节(Byte),1 byte = 8 bit
一、定义
1.1地址
在内存区,每一个字节都有一个编号,这个编号就是“地址”,它相当于学生宿舍的房间号,例如“101”房间,每个房间里面可以居住学生,即每个地址标注的内存单元(字节)可以存放数据,相当于房间中有8张床,对应于1个字节(byte)有8位(bit)。
注意:不同类型的数据分配的存储单元大小(字节数)和存储方式(整数以补码形式存放,实数以指数形式存放)是不同的。C语言中的地址包括位置信息(编号)和类型信息,或者说是“带类型的地址”。
int a; //定义整型变量a
&a; //得到变量a的地址,或者说是“整型变量a的地址”
&:取地址运算符
1.2指针
因为可以通过地址找到对应的存储单元,所以将这个“地址”形象化的称之为“指针”,意思通过它就能指向所需要的内存单元。
访问变量存储单元的方式有两种
①直接访问:在编译时,系统已经建立了变量名和地址的对应表,因此通过变量名就能访问到相应地址对应的存储单元。
②间接访问:即将变量的地址存放在“另一变量”中,然后通过访问“另一变量”找到原变量的地址,从而访问相应的存储单元。即将变量 “i” 的地址存放在变量 “i_pointer” 中,通过访问变量 “i_pointer” 找到变量 “i” 的地址。
1.3指针变量
专门用来存放“变量地址(指针)”的变量即称之为“指针变量”,也可以称为地址变量;在C语言中,可以定义整型,浮点型,字符型等指针变量。
定义方法为:类型名 * 指针变量名
int* a_pointer;
float* b_pointer;
char* c_pointer;
也可以在定义的同时进行初始化:
int a; //整型变量
int* a_pointer = &a; //整形指针变量
float b; //浮点型变量
float* b_pointer = &b; //浮点型指针变量
char c; //字符型变量
char* c_pointer = &c; //字符型指针变量
在定义时,必须指定该指针变量的指向的变量的类型。
1.4指针和指针变量的区别
通过上面的了解,我们再来看这幅图,我们可以知道,变量 i 的指针(地址)是1000,变量 j 的指针是1004,变量 k 的指针是1008,而不能说变量 i 的指针变量是1000。变量 j_pointer 存放的是变量 j 的地址,所以 j_pointer 是一个指针变量。
指针是一个具体的地址,而指针变量是存放地址的变量;
指针是具体的,指针变量在未指向实际存储地址时,是不确定的。
二、使用指针变量的实例
#include<stdio.h>
int main()
{
int a = 12, b = 21; //定义两个整型变量并初始化
int* p1, * p2; //定义两个指向整型的指针变量
p1 = &a; //赋予a的地址
p2 = &b; //赋予b的地址
printf("a = %d, b = %d\n", a, b); //输出a,b的值
printf("*p1 = %d, *p2 = %d\n", *p1, *p2); //输出两个指针变量的值所指向的变量值
return 0;
}
2.1程序分析
第5行定义了两个指针变量 p1 和 p2,但此时他们并未指向任何一个变量,只是两个指针变量,第6,7行使他们指向整型变量 a 和 b;第8行输出变量 a 和 b 的值,第9行输出 *p1 和 *p2 的值,(*)表示指向,也就是变量 a 和 b。
(*):指针运算符(间接访问运算符)
2.2带(*)号的解释
程序中出现了两处*p1和*p2,分别在第5行和第9行,二者意义不同;
第5行的 *p1 和 *p2 表示定义两个指针变量 p1 和 p2,他们前面的(*)仅表示该变量是指针变量,第9行的 *p1 和 *p2 表示指针变量 p1 和 p2 所指向的变量,即 a 和 b。
注意:指针变量是p1和p2,而不是*p1和*p2,所以第6,7行不能写成
*p1 = &a;
*p2 = &b;
因为变量 a 的地址是赋给指针变量 p1,而不是赋给指针变量所指向的变量 *p1(即变量a)。
2.3引用指针变量的3种情况
①给指针变量赋值
p = &a; //把a的地址赋给指针变量p
②引用指针变量指向的变量
printf("%d", *p); //以整数形式输出指针变量p所指向的变量的值
③引用指针变量的值
printf("%p", p); //以16进制输出指针变量的值,即地址
指针的概念比较复杂,使用也比较灵活。