C语言指针操作(一)地址,指针,指针变量是什么

指针操作系列文章:

C语言指针操作(一)地址,指针,指针变量是什么

C语言指针操作(二)指针变量作为函数参数

C语言指针操作(三)通过指针引用数组

C语言指针操作(四)用数组名作函数参数

C语言指针操作(五)通过指针引用多维数组

C语言指针操作(六)通过指针引用字符串

C语言指针操作(七)指向函数的指针

C语言指针操作(八)返回指针值的函数

C语言指针操作(九)指针数组和多重指针

C语言指针操作(十)动态内存分配与指向它的指针变量

C语言指针操作(十一)有关指针的小结


地址,指针,指针变量是什么?他们的区别?符号(*)在不同位置的解释?

指针是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进制输出指针变量的值,即地址

指针的概念比较复杂,使用也比较灵活。

  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

juechen333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值