当前位置:文档之家› C 语言中指针的运算详解

C 语言中指针的运算详解

在C语言中,指针和数组名通常都可以混用。

例如
char*p;
访问时,*p跟p[0]是一样的,*(p+1)跟p[1]是一样的。

对于数组
char b[5];
访问时,b[0]跟*b是一样的,b[2]跟*(b+2)是一样的。

在一般的通信中(例如串口),通常都使用字节传输。

而像float,long int之类的,
有4字节。

我的方法就是取它的地址,强制转换为char型指针,然后当作数组来用。

float x;
SBUF=((char*)&x)[0];
SBUF=((char*)&x)[1];
SBUF=((char*)&x)[2];
SBUF=((char*)&x)[3];
接收时,刚好倒过来。

更有趣的是,对于数组形式,数组名和后面的偏移量可以随便换。

char buff[10];
//或者用char*buff=&buffer;
buff[3]=0xaa;
3[buff]=0xaa;//居然是一样的,倒塌...
因此,我认为编译器是这么干的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy),因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了...非典用法,请勿乱用,出了事偶不负责...
指针变量可以进行赋值运算、加减算术运算以及关系运算。

一、赋值运算
1、把一个指针变量的值赋给指向相同类型变量的另一个指针变量。

如:
int x,*ptr_x,*ptr_y;
ptr_x=&x;
ptr_y=ptr_x;
指针ptr_x的值为变量x的地址。

赋值语句将指针ptr_x的值赋给指针ptr_y,现在指
针ptr_x和指针ptr_y指向同一个变量x。

2、把数组的首地址赋给指针变量。

如:
int a[5],*pa;
pa=a;
由于数组元素占用内存中一块连续的存储单元,数组名就表示数组的首地址,所以可以将数组名直接赋给一个指向数组的指针变量pa。

注意,在赋值语句的数组名a前面不用取址符&。

二、算术运算
数值变量可以进行加减乘除算术运算。

而对于指针变量,由于它保存的一个内存地址,那么可以想象,对两个指针进行乘除运算是没有意义的。

那么指针的算术就主要是指指针的移动。

即通过指针递增、递减、加上或者减去某个整数值来移动指针指向的内存位置。

1、使用递增/递减运算符(++和--)将指针递增或递减。

如:
int*ptrnum,arr_num[10];
ptrnum=arr_num;
ptrnum++;
其中,指针ptrnum指向整型数组arr_num,即存储数组中第一个元素的地址。

然后,使用++运算符递增该指针。

这意味着,ptrnum此时指向arr_num[0]地址之后的下一个连续地址,即数组中下一个元素的地址。

应该注意,数组指针变量向前或者向后移动一个位置和地址加1或减1在概念上是不同的。

指针变量加1,即向后移动1个位置表示指针变量指向下一个元素的首地址。

而不是在原地址基础上加1。

所以,一个类型为T的指针的移动,以sizeof(T)为移动各单位。

2、将指针加上或者减去某个整数值。

当指针加上或者减去某个整数值时,指针向前或者向后移动n个数据单元。

如:
ptrnum=&arr_num[5];
ptrnum=ptrnum-2;
此处指针首先指向数组的第六个元素,然后将指针减去2。

这意味着ptrnum此时指向数组的第四个元素,即arr_num[3]。

三、关系运算
两个指针在有意义的情况下,可以做比较运算。

如可以比较两个指针,看它们是否相等,即这两个指针是否指向同一个变量。

如:
#include<stdio.h>
void main()
{
int*ptrnum1,*ptrnum2;
int value=1;
ptrnum1=&value;
value+=10;
ptrnum2=&value;
if(ptrnum1==ptrnum2)
printf("\n两个指针指向同一个地址\n");
else
printf("\n两个指针指向不同的地址\n");
}
其中,声明了两个指针变量ptrnum1和ptrnum2。

另外还声明了一个int类型的变量value,初始值为1。

接着将变量value的地址赋给指针ptrnum1中。

然后将value加10,再将value 的地址赋给指针ptrnum2中。

通过if语句判断ptrnum1和ptrnum2是否相等,即判断它们是否指向同一个地址。

由于指针ptrnum1和ptrnum2存储的都是变量value的地址,因此即使变量value的值增加了10,地址也仍保持不变,因此相等条件的值为真,输出结果为“两个指针指向同一个地址”。

相关主题