C语言——指针(二)

📝前言
上篇文章C语言——指针(一)初步讲解了:
1,指针与指针变量
2,指针变量的基本使用(如何定义初始化引用
这篇文章我们进一步探讨,使用指针中有关指针的运算
1,指针运算
2,指针变量类型对指针使用的影响

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:不管怎么样,明天又是新的一天!

文章目录

    • 一,指针运算
      • 1,指针+-整数
      • 2,指针-指针
      • 3,指针的关系运算
    • 二,指针变量类型对指针使用的影响
      • 1,影响指针解引用权限
      • 2,影响指针+-整数的运算

一,指针运算

指针的基本运算主要分三种,分别是:
1,指针±整数
2,指针-指针
3,指针的关系运算

1,指针±整数

因为数组元素在内存中是连续存放的,那么,我们能不能通过【首地址+偏移量】的方式来得到其他元素的地址呢?
答案是可以的,比如下面的代码:

int main()
{
	int arr[5] = { 1,2,3,4,5 };  
	int* p = &arr[0];   //取出首元素的地址放入指针p
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", *(p + i));  //(p+i)就是(指针+整数)的形式
	}
}

输出结果是:
1 2 3 4 5

也就是说:
(p+i)所代表的地址,随着i每次加1,地址也跳跃到了后面的元素
所以:
**指针±整数**就是:指针为首地址,来计算出偏移量为整数的元素的地址,让指针实现向前和向后的跳跃。

2,指针-指针

前提条件:两个指针必须指向同一块空间(比如,同一个数组)
来看下面代码:

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* p1 = &arr[0];  //p1存放的是第一个元素的地址
	int* p2 = &arr[4];  //p2存放的是最后一个元素的地址
	printf("p1 = %p\n", p1);  //打印指针p1的内容
	printf("p2 = %p\n", p2);  //打印指针p2的内容
	printf("p2 - p1 = %d\n", p2 - p1);  //大地址-小地址
	printf("p1 - p2 = %d\n", p1 - p2);  //小地址-大地址
	return 0;
}

输出结果:

我们可以发现:
虽然指针是用16进制数来表示的,但是输出结果并不是将两个16进制数单纯的进行加减运算,输出结果也并不是一个指针。
实际上,指针-指针的绝对值是:指针之间元素的个数

对于指针±整数,指针-指针我们可以类比理解:
日期±天数:得到的是日期
日期-日期:得到的是天数
(在这里,日期就好比地址天数就好比整数

3,指针的关系运算

其实就是指针的大小比较,例如:

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* p = &arr[0];
	while (p < arr + 5)  //这里就是比较p和arr+5的(16进制数)大小
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

输出结果是:
1 2 3 4 5

二,指针变量类型对指针使用的影响

1,影响指针解引用权限

指针的解引用权限通俗来讲就是:一次性能操作几个字节

我们来看下面两段代码:

这里是引用

两段代码都是通过对指针解引用来操作n,给n赋值。区别在于左边的指针变量是int* 类型,但是右边的指针变量是char*类型

我们在调试时观察n的变化:

这里是引用

发现:
用 int* 类型的指针变量时,n被完全改成了0(其实被改了4个字节)
0x11223344 → 0x00000000
用 char*类型的指针变量时,n只被改了一部分(其实被改了1个字节):
0x11223344 → 0x11223300
这就是为什么图左的n值减少了120(转换为10进制)

上述现象都是因为:指针变量的类型决定了指针解引用的权限
char* 的指针解引用只能一次访问1个字节,但是int* 的指针解引用就可以访问4个字节
同理:
double* 可以访问8个字节
short* 可以访问2个字节

2,影响指针±整数的运算

来看下面的代码:

int main()
{
	int n = 10;
	char* p1 = (char*)&n;
	int* p2 = &n;

	printf("&n   = %p\n", &n);
	printf("p1   = %p\n", p1);
	printf("p1+1 = %p\n", p1+1);
	printf("p2   = %p\n", p2);
	printf("p2+1 = %p\n",p2+1);
	return 0;
}

运行结果,我们观察地址的变化:

这里是引用

我们发现:
对于char* 类型的指针变量p1,+1操作让地址向后跳过了1个字节
对于int* 类型的指针变量p2,+1操作跳过了让地址向后跳过了4个字节

这就是指针变量类型不同对指针±整数的影响:
指针变量的类型决定了指针向前或者向后走一步的距离(跳过的字节的大小)

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!最后,☺祝愿大家天天开心!!!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月20日
下一篇 2023年12月20日

相关推荐