指针的运算

指针的存储大小

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
	char a[]={0,1,2,3,4,5,6,7,8,9};
	char *p=a;
	printf("p=%p\n",p);
	printf("p+1=%p\n",p+1);
	int b[]={0,1,2,3,4,5,6,7,8,9};
	int *q=b;
	printf("q=%p\n",q);
	printf("q+1=%p\n",q+1);
	return 0;
}

运行结果
在这里插入图片描述
char占一个字节,所以p到p+1地址移动一位
int占四个字节,所以p到p+1地址移动四位
p到p+1移动的是一个p指向的sizeof(“p指向的类型”)

指针运算

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
	char a[]={0,1,2,3,4,5,6,7,8,9};
	char *p=&a[0];
	char *p1=&a[5];
	printf("p=%p\n",p);
	printf("p1=%p\n",p1);
	printf("p1-p=%d\n",p1-p);
	int b[]={0,1,2,3,4,5,6,7,8,9};
	int *q=b;
	int *q1=&b[6];
	printf("q=%p\n",q);
	printf("q1=%p\n",q1);
	printf("q1-q=%d\n",q1-q);
	return 0;
}

运行结果:
在这里插入图片描述
根据q1和q地址16进制下地址的值做相减,可得10进制下24,但最后输出的是6
实际上指针地址相减后还会除以sizeof(“指向类型”)

指针的运算优先级

指针运算优先级比“+”高,所以要用*(p+1)
但是指针的运算优先级比“++”小

代码示例:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
	int a[]={10,1,2,3,4,5,6,7,8,9};
	int *p;
	p=&a[0];
	printf("address p=%p\n",p);
	printf("p[0]=%d\n",*p++);
	printf("address p=%p\n",p);
	/*
	int b[]={0,1,2,3,4,5,6,7,8,9};
	int *q=b;
	int *q1=&b[6];
	printf("q=%p\n",q);
	printf("q1=%p\n",q1);
	printf("q1-q=%d\n",q1-q);
	*/
	return 0;
}

在这里插入图片描述
可以发现,指针已经向后移动了一个sizeof(),“++”运算比指针高
之所以元素值还是第一个元素是因为“++”在p的后面,它要运行完了再++
如下就是先++

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
	int a[]={10,1,2,3,4,5,6,7,8,9};
	int *p;
	p=&a[0];
	printf("address p=%p\n",p);
	printf("p[0]=%d\n",*++p);
	printf("address p=%p\n",p);
	/*
	int b[]={0,1,2,3,4,5,6,7,8,9};
	int *q=b;
	int *q1=&b[6];
	printf("q=%p\n",q);
	printf("q1=%p\n",q1);
	printf("q1-q=%d\n",q1-q);
	*/
	return 0;
}

运行结果:
在这里插入图片描述
如果是“+”,那指针的运算优先级更高,如下

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
	int a[]={10,1,2,3,4,5,6,7,8,9};
	int *p;
	p=&a[0];
	printf("address p=%p\n",p);
	printf("p[0]=%d\n",*p+1);// *先运算
	printf("address p=%p\n",p);
	/*
	int b[]={0,1,2,3,4,5,6,7,8,9};
	int *q=b;
	int *q1=&b[6];
	printf("q=%p\n",q);
	printf("q1=%p\n",q1);
	printf("q1-q=%d\n",q1-q);
	*/
	return 0;
}

在这里插入图片描述
如上就是*先运算,先取出值再+1

### 关于指针运算 在C/C++中,指针运算是非常重要的概念之一。通过指针可以访问内存中的不同位置,并执行各种操作。 #### 指针算术运算 当对指针应用加法或减法,编译器会自动考虑数据类型的大小[^1]。例如: - 如果 `ptr` 是指向整型变量的指针,则表达式 `ptr + 1` 实际上会使该指针前进到下一个整数的位置。 ```c++ int numbers[] = {1, 2, 3}; int *ptr = &numbers[0]; // ptr现在指向数组的第一个元素 ptr++; // ptr现在指向数组的第二个元素 ``` 对于不同的基本类型,每次增加或减少的数量也有所不同。比如浮点数占用四个字节,在这种情况下移动一个单位意味着跳过这四字节的空间;而对于双精度浮点数来说则是八个字节等等[^4]。 #### 数组与指针的关系 在很多方面,数组名可以用作指向其首个成员的常量指针来处理。因此可以通过索引来获取特定位置上的值或者使用偏移量来进行遍历。 ```c++ char str[] = "Hello"; for (char* p = str; *p != '\0'; ++p){ putchar(*p); } puts(""); ``` 这段代码展示了如何利用指针遍历整个字符串并打印出来。这里`str`实际上就是指向字符序列起始处的一个指针。 #### 函数参数传递中的指针 除了作为独立的数据项外,指针还经常被用来向函数传递复杂结构体或其他大型对象而无需复制它们的内容。这样不仅可以提效率还可以简化接口设计。 ```cpp void swap(int& a,int& b){ int temp=a; a=b; b=temp; } // 或者更常见的是使用指针形式 void swap_ptr(int* pa, int* pb) { int temp=*pa; *pa=*pb; *pb=temp; } ``` 上述例子说明了两种方法都可以达到交换两个数值的效果,但是后者更加直观地体现了底层机制的工作原理。 #### 安全性和注意事项 尽管灵活强大,但不当使用的后果可能很严重——容易引发未定义行为甚至安全漏洞。所以在实际开发过程中应当格外小心谨慎对待每一个涉及指针的操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值