C语言 认识指针

1.为了说清楚什么是指针,就要先弄清楚数据在内存中是如何存储的,又是如何读取的。
在程序中定义一个变量,在对程序进行编译时系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。例如,整型变量分配4个字节,单精度浮点型变量分配4个字节,字符型分配1个字节。内存区的每一个字节有一个编号,这就是“地址”,它相当于房间号。在地址所标志的内存单元中存放的数据则相当于房间中居住的人。
2.由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。
打个比方,一个房间的门口挂了一个房间号2008,这个2008就是房间的地址,或者说2008“指向”该房间。
因此,将地址形象化地称为“指针”。 意思是通过它可以找到以它为地址的内存单元。
说明:
3.关于存储单元的访问
在C语言中。数据是分类型的,对不同类型的数据,在内存中分配的存储单元的大小(字节数)和存储方式是不同的。
如果只指定了地址1010,希望从该单元中调出数据,这是做不到的,虽然可以找到所指定的存储单元,但是无法确定是从几个字节中获取信息。也没有说按什么存储方式存取数据(单精度浮点型和整型都是4个字节,但是存储方式不同)。
因此为了有效的**存取一个数据,除了需要位置的信息,还需要有该数据的类型信息。**如果没有该数据的类型信息只有位置信息,无法对数据进行存取。
C语言中的地址包括位置信息和它所指向的数据的类型信息,也就是说它是“带类型的地址”。
如:&a,一般称它为变量a的地址。
注意:
如果有int型变量a和float型变量b,如果先后把它们分配在2000开头的存储单元中,&a和&b的信息不相同。因为虽然存储单元的编号相同,但是它们的数据类型不同。
4.务必弄清楚存储单元的 地址 和存储单元的 内容 的区别。
假设程序已经定义了三个变量i,j,k,在程序编译时,系统可能分配地址为2000-2003的4个字节给变量i,2004-2007的4个字节给变量j,2008-2011的4个字节给k,(不同的编译系统在不同次的编译中,分配给变量的存储单元的地址是不同的)

int main()
{
	int i, j, k; //定义变量i,j,k
	scanf("%d", &i);  //从键盘输入i的值
	j = 6;
	k = i + j;
	printf("k=%d", k);
	return 0;
}

【分析】
(1)在执行scanf("%d", &i); 这句程序的时候,把键盘输入的值送到地址为2000开头的整型存储单元中。
(2)这条程序语句k = i + j;,则是从2000-2003字节中取出i的值3,再从2004-2007取出j的值6,将它们相加后再将其和的值9送到k所占用的2008-2011字节的单元中去。
(3)printf("k=%d", k);在执行此语句时,首先通过变量名k找到相应的地址,从该4个字节中按照整型数据的存储方式读出整型变量k的值,然后按照十进制整数格式输出。
5.对变量的访问都是通过地址进行的,分为 直接访问和间接访问
直接访问: 直接按变量名直接向变量i赋值,由于变量名与变量地址有一一对应关系,因此就按此地址直接对变量i的存储单元进行访问(如把数值3存放到变量i的存储单元中)。
请添加图片描述
上述程序其中的一个语句k = i + j;,则是从2000-2003字节中取出i的值3,再从2004-2007取出j的值6,将它们相加后再将其和的值9送到k所占用的2008-2011字节的单元中去,就是直接访问。
间接访问:先找到存放变量i地址的变量i_pointer,从其中得到变量i的地址(2000),从而找到变量i的存储单元,然后对它进行存取访问。
请添加图片描述
在C语言程序中,除了可以定义整型变量、浮点型变量、字符型变量等,还可以定义一种特殊的变量,用它存放地址。
假设定义了一个变量i_pointer来存放整型变量i的地址。可以通过下面语句将i的地址(2000)存放到p中。
i_pointer=&i //将i的地址存放到i_pointer中
这时,i_pointer的值就是2000(变量i所占用单元的起始地址)。
用间接访问的方式存取变量i的值:先找到存放“变量i的地址”的变量i_pointer,从中取出i的地址(2000),然后到2000字节开始的存储单元中取出i的值(3),如下图所示:
请添加图片描述
6.区分指针变量和指针
为了表示将数值3送到变量中,可以有两种表达方法:
(1)将3直接送到变量i所标识的单元中,例如“i=3;”。
(2)将3送到变量i_pointer所指向的单元(即变量i的存储单元),例如“*i_pointer=3;”,其中*i_pointer表示i_pointer指向的对象。
指向就是通过
地址
来体现的。假设i_pointer中的值是变量i的地址(2000),这样就在i_pointer和变量i之间建立起一种联系,即通过i_pointer就可以知道i的地址,从而找到变量i的内存单元。上图中的单箭头就表示这中“指向”关系。
由于通过地址可以找到所需的变量单元,因此说,地址指向该变量单元(如同说,一个房间号“指向”另一个房间一样)。将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元(如同根据地址2000可以找到变量i的存储单元一样)。
如果有一个变量专门用来存放另一个变量的地址(即指针),则称它为 “指针变量”。上述的i_pointer就是就是一个指针变量。指针变量就是地址变量,用来存放地址,指针变量变量的值是地址(即指针)。
注意:一定要区分“指针”和“指针变量”这两个概念,例如,可以说变量i的指针是2000,而不能说i的指针变量是2000。指针是一个地址,而指针变量是存放地址的变量。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值