你的月亮我的C(七):指针的那些事

本文深入解析C语言中的指针概念,包括指针的基本定义、如何定义指针变量、指针与数组的关系以及指针变量如何使用下标。文章强调了指针在C语言中的重要性,并详细阐述了正确使用指针的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看了一本C教材,里面指针部分讲了74页,讲的很好,指针是C的精华,熟练使用指针,等以后用到结构体指针的时候你会发现很方便,而结构体又是C中类似于面向对象的思想。

一、什么是指针

内存中每一个字节都有一个编号,称为地址,指针是用来存放地址的,地址标识内存中的某一个单元,所以可以用指针找到该地址的内存单元。

我们知道数据是分类型的,int和float类型4个字节,double类型8个字节,不同类型的数据在内存中分配的存储单元是不同的,所以如果只是给定一个地址,输出这个地址标识的内存单元的数据是不行的,因为不知道这个地址的数据用什么方式“提取”,从4个字节提取数据还是8个字节?所以存储一个数据除了包含地址外,还要包含数据类型。C中的地址就是包含内存编号和数据类型两部分,书上一句形容很好,“C中的地址是带类型的地址”。

指针是一个地址,可以通过指针找到该地址标识的内存单元,访问数据。

二、定义指针变量

教科书上都会有定义指针变量形式为:类型名 *指针变量名。例如int *p;其中类型名int是定义指针必须包含的“基类型“,基类型规定这个指针可以用来指向什么数据类型的变量,因为前面说到了,不同的数据类型在内存中所占的字节数和存放方式是不一样的。用书上一句话说:”指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在。“

举个例子,我们定义:

int a;

double *p;

p=&a;

这样在编译时就会给出警告,整型变量a是int类型的数据,p是一个指向double类型的指针变量,如果强行运行程序,系统会把&a就是整形变量a的地址自动转为为double类型,然后赋值给指针变量p,这样做的后果可能会出现无法预知的错误。例如,完成整型变量a的地址赋值给double类型的指针变量p后,p+1,意味着什么?使指针移动一个位置,这个加1是地址值增加4个字节还是8个字节?可能是8个,因为上面说强行赋值系统会自动类型转换,总之这种做法不应该使用,因为很容易出现不可预知的错误,太危险了。

还有一点,指针变量只能存放地址,不能把一个数值赋值给一个指针变量,例如*p=1010;这种做法是错误的!!!!因为地址只能用地址符“&“来取得。不过我相信你们肯定看到过上面这种赋值方式,前提是这个指针变量已经指向一个地址了!例如下面这样:

int a, *p;

p=&a;

*p=9527;

此时的*p=9527,因为指针变量p指向了整型变量a,所以表示把整数9527赋值给指针变量p所指向的变量a。这样是可以的,而上面说的那个错误方式*p=1010,指的是如果你的代码是这样:

int *p;

*p=1010;

这样是错的,尝试指定一个地址整数给指针变量,是不行的,因为这样系统不确定1010它是一个地址,再次重点说明!C的地址是带类型的地址,可以说你只给了指针变量一个看似是地址的值,可是它是什么数据类型,系统不知道,就没法读出数据了,严谨准确来说,不能用一个数值代表地址。

三、指针与数组

我们知道引用数组元素有下标法和指针法,下标法就是arr[ 4 ]这种方式,指针法大家都接触过,在C中,数组名代表的不是整个数组,而是这个数组中首元素的地址,而地址就是指针,数组名其实是一个指针型常量。所以有下面这样的写法:

p=&arr[ 0 ];

p=arr;

这两种写法是等价的。指针法引用数组就是这样,通过指针指向数组的首元素地址后,对指针做移动(加一减一之类的)来访问数组中的元素。除了加一减一,自增自减之类的操作,还可以两个指针相减,不过要求两个指针都是指向同一个数组里的元素时才可以这样使用。

对一个指针做+1操作时,并不是简单的对指针所指的地址值加一,而是对地址值加上一个该地址内存单元数据类型的字节数,例如一个指向整型变量的指针变量p,p+1后是对指针所指的地址值加上4个字节,这样才会指向下一个地址元素。引用书上的总结:“point+1所代表的是point+1*d,d是指针基类型所占的字节数。“

实际上,在编译的时候,系统对数组元素的处理arr[ i ]就是按照*(arr+i)处理的,也就是按照数组首元素(即数组名)的地址加上位移量来找到元素的地址。举个例子,一个double类型的数组,如果首元素地址是100,那么arr[ 4 ]的地址就是100+4*4=116。

四、指针变量也可以带下标?

上面说过,对于数组arr[ i ],编译时系统会把它当作*(arr+i)处理,“ [ ] ”是变址运算符,当指针变量指向数组元素时,指针变量是可以带下标的,让指针变量p指向数组arr[ 0 ]后,p[ i ]就等于arr[ i ],但是如果指针变量一开始指向的不是arr[ 0 ]而是(假设)arr[ 4 ],那么p[ i ]就不等于arr[ i ]了,而是p[ 0 ]等于arr[ 4 ],p[ 1 ]等于arr[ 5 ],依此类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值