c语言指针运算


一、指针运算概述

1.1 指针运算是以指针变量的地址作为操作对象进行计算。因此指针运算的实质是地址运算。
1.2 由于指针是持有地址的变量,所以指针的运算与普通变量的运算在种类和意义上是不同的。
1.3 指针运算的种类分为:
算数运算、关系运算、赋值运算。

二、指针的算数运算

指针的算数运算是按c语言地址计算规则进行的,这种运算与指针指向的数据类型(每个数据类型在计算机中存储的长度有关)。
例:
指针 a1 a2 指向具有相同数据类型的一组若干数据的指针, n为整数,则指针可以进行算术运算如下:
a1+n;a1-n;a1++;a1–;++a1;–a1;a1-a2;

2.1 指针与整数的加减运算

指针变量作为一个地址进行加上或减去一个整数n,其功效就是指针当前位置向前或向后移动第n个数据长度的位置。由于指针可以指向不同的数据类型,即数据长度不同的数据,所以这种算术运算地址移动的长度取决于数据类型的长度。
例:
int *a;
a+1; //地址加2个字节所指向的位置
a+整数n = a+n*sizeof(p)


2.2 指针++ –运算

指针++ -- 运算同普通变量的算数运算具有同样的操作。
++ 运算指向下一个数据位置,--运算指向上一个数据位置,运算后的地址变化取决于数据类型的大小。
例:


a= *a1++; //指针后置
//由于 ++ *的优先级高于=, ++ * 属于同级运算,而表达式的运算方式自右向左,所以先进行++结合,但是++为后置所以,先将a1的值赋值给a ,再 ++指针
a= *a1++ 等同于 a= *a1 后 ++a1;


a = * ++a1;
//根据预先级 和 运算方式,我们可以看出
a= * ++a1等同于 a=*(++a1);


三、指针的相减

设定指针a1 a2指向同一数据类型相同的数据,则a1-a2运算的结果值是两指针指向的地址位置之间的数据个数。故两个相同类型的指针之间的运算实际上也是在进行地址运算,
所以两个指针之间的运算实际就是:
(a1)-(a2)


sizeof(a1);
(a1) 、(a2)分别表示指针a1 a2 所对应的地址值,除以a1每个元素所占用的字节数,而得到两个地址之间相差的元素数,因为指针的数据类型相同,所以得到的结果会是一个整数。



四、指针的关系运算

两个指向同一组 数据类型相同的数据 之间的指针可以进行各种关系运算。两之间的关系运算表示它们指向的地址位置的关系。
假设数据在内存中的存储逻辑是由前向后,那么指向后方的指针大于指向前方的指针。
对于两指针 a1 a2 之间的关系表达式:
a1
五、指针的赋值运算

向一个指针变量赋值,表达式右则必须为地址常量或变量,不能为普通的整数。
常见的赋值操作如下:
1 一个变量的地址给指针赋值
int a1,*a2;
a2 =&a1;
//将一个变量地址赋值给指针变量
2 指针给指针赋值
int *a1,*a2,a3;
a1 =&a3;
a2 =a1;
//将一个地址常量赋值给另一个指针
3 数组赋值
char a[5];*a2,*a3;
a2 =a; //将一个数组赋值给指针变量
a3 =&a[1];
4 由malloc申请一个指针的地址
常见的用法
#include “stdio.h”
#include “stdlib.h”
#include “string.h”
int main(){
char *a;
if((a=(char *)malloc(10000)) == NULL)
{
printf(“分配内存失败!”);
exit(0);
}
strcpy(a,”hello c”);
printf(“%s\n”,a);
free(a);
}
相关阅读:
c语言指针注意事项
malloc的使用方法及注意事项