指针运算的简单总结

一 使用指针需注意的问题

1、定义指针变量时,左侧应有类型名,否则就不是定义指针变量。

2、指针变量的含义包括两方面;一是以存储单元编号表示纯地址;二是指向存储单元的数据类型。

3、指针变量中只能存放地址,不要将一个整数赋给一个指针变量。

4、指针中不可通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值(数据的方向是从实参传递到形参,单向传递)

5、基于安全性问题,必须初始化指针,一般初始化为NULL.

二 通过指针引用数组及指针的运算

1、数组元素的指针就是数组元素的地址(数组元素都在内存中占用存储单元,它们都有相应的地址)

2、数组名代表数组的首元素,引用其的方法为:
(1)下标法,如a[i]形式;
(2)指针法,如*(a+i)或*(p+i).

3、指针运算
(1)指针以指向一个数组元素时,可以进行以下运算
p+1,p-1,++p,p++,p- -,- -p
(p+1是指向同一数组中的下一个元素,加一代表的是加上一个数组元素所占用的字节数,同理可知p-1)

#include<stdio.h>
int main()
{
	int a[5]={1,2,3,4,5};
	int *p;
	p=a;
	printf("%d\n",p);
	printf("%d",p+1);
	return 0;
 } 

在这里插入图片描述

各种类型的大小:int类型四个字节,char类型一个字节,long,double,long long类型均为八个字节,long double类型为十六个字节

4、*(p+i) 或 * (a+i)是p+i 或a+i所指向的数组元素,即a[i],三者等价([ ]是变址运算符,将a[i]按a+i计算地址,然后找出此地址单元的值

#include<stdio.h>
int main()
{
	int a[5]={1,2,3,4,5};
	int *p;
	p=a;
	printf("%d\n",*(p+1));
	printf("%d\n",*(a+1));
	printf("%d",a[1]);
	return 0;
 } 

在这里插入图片描述

5、P2 - P1,指的是元素的相对距离,结果计算为:(p2-p1)/数据元素的长度(类型)
例:p2指向a[3.]为16,p1 指向a[1.]为8,p2-p1 =(16-8)/4=2而p2+p1无实际意义

计算数组长度 sizeof(数组名)/sizeof(数组类型)
在这里插入图片描述

6、++(*p) 表示P 所指向的元素加1;如:p=a,++(*p)相当于++a[0],若a[0]的值为1,则执行++(*p)后a[0]的值为2

7、需注意的是,* (p++)与 * (++p)的作用是不相同的前者是先取*p的值,在进行p+1,后者是先进行p++ ,再取 *p

#include<stdio.h>
int main()
{
	int a[5]={1,2,3,4,5};
	int *p;
	p=a;
	printf("%d\n",*(++p));//*(p++)
	//*(++p)的结果为2,*(p++)的结果为1
	return 0;
 } 

例;若p的初值为a[0],输出 *(p++),得到a[0],输出 *(++p),得到a[1.]的值。

以上的指针运算均不可用数组名代替,数组名代表的是首元素的地址,它是一个指针型常量,它的值在程序运行期间是固定不变的,如a++是无法实现的。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值