【C语言初阶】指针运算

【C语言初阶】指针运算

四、指针运算

1 介绍

指针能进行的运算有:

  • 指针 ± 整数
  • 指针 - 指针
  • 指针的关系运算


2 指针 ± 整数

2.1 示例

代码示例

#include<stdio.h>

#define VALUE 10
int main()
{
	//指针 +- 整数

	float values[VALUE];
	float* vp = NULL;

	for (vp = &values[0]; vp < &values[VALUE];)
	{
		*vp++ = 0;
		//*vp=0; vp++;
	}

	return 0;
}

解释说明

1 指针 ± 整数,表示指针向前或向后走一步有多大(距离)


3 指针 - 指针

| 指针 - 指针 | :得到的是指针与指针之间的元素个数

前提指针必须指向同一块内存

3.1 示例

代码示例

#include<stdio.h>

int main()
{
	//指针 - 指针

	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);//9

	return 0;
}

解释说明

1 |指针-指针| 得到的是指针与指针之间的元素个数

2 下标为9的元素与下标为0的元素,中间相差9个元素


3.2 模拟实现 strlen()

3.2.1 方法一:指针 - 指针

代码示例

#include<stdio.h>

//模拟实现strlen()
#include<assert.h>//assert()
int my_strlen(const char* str)
{
	assert(str);//字符串为空就触发警告

	char* p = str;
	//寻找字符串结束标志\0
	//while (*p != '\0')
	//{
	//	p++;
	//}
	//
	//while (*p)
	//{
	//	p++;
	//}
	while (*p++)
        continue;
	p--;//循环中p最后指向\0的下一位,需要-1移动到\0的位置

	return p - str;//指针-指针,得到的是指针与指针之间的元素个数
}
int main()
{
	//方法一:指针-指针

	int ret = my_strlen("hello");
	printf("len = %d\n", ret);//5

	return 0;
}

解释说明

1 字符指针 p 移动至 \0 的位置,然后减去起始位置的指针 str,最终得到二者之间的字符个数(字符串长度)

2 assert(str) 断言,检查传入的字符指针 str 是否为空。需要包含头文件 #include<assert.h>


3.2.2 方法二:计数器

代码示例

#include<stdio.h>

#include<assert.h>
int my_strlen(char* str)
{
	assert(str);//断言

	int count = 0;
	while (*str++ != '\0')
		count++;

	return count;
}
int main()
{
	//方法二:计数器

	int ret = my_strlen("hello");
	printf("len = %d\n", ret);//5

	return 0;
}

解释说明

1 while (*str++ != '\0')寻找 \0 ,每找一个不是 \0 的字符,计数器+1


3.2.3 方法三:函数递归

代码示例

#include<stdio.h>

int my_strlen(char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	//方法三:函数递归

	int ret = my_strlen("hello");
	printf("ret = %d\n", ret);

	return 0;
}

解释说明

1 递归实现,每访问一个非 \0 字节的地址,就返回计数+1再次函数调用寻找 \0

  直到找到 \0 就返回字符计数,即得到最终的字符个数(字符串长度)。


4 指针的关系运算

地址是一个数值,也是有大小的,一般用十六进制数表示

指针的关系运算就是比较指针的值,也就是比较地址的大小

4.1 示例1

示例

for(vp = &values[VALUES]; vp > &values[0]; )
{
	*--vp=0;
}

说明

1 vp >= &values[0] :指针的关系运算,比较两个地址的大小

2 &arr[n] > &arr[0]数组长度充当下标进行关系运算是可以的

数组末尾元素后一地址

4.2 示例2

示例

for(vp = &values[VALUES-1]; vp >= &values[0]; vp--)
{
	*vp=0;
}

说明

1 vp >= &values[0] 指针的关系运算,比较两个地址的大小。

2 &arr[0] > &arr[-1]不允许数组首元素的地址与首元素前一个位置的地址进行关系比较
数组首元素前一地址

3 这样比较可能会出问题,因为这是标准未定义的关系运算,并不一定保证可行


4.3 标准规定

C语言标准规定,允许指向数组元素的指针指向数组最后一个元素之后内存位置的指针进行关系比较,但是不允许与指向首元素之前内存位置的指针进行关系比较。


总结:

  本节介绍了指针的运算,包括指针 ± 整数、指针 - 指针以及指针的关系运算。


感谢您的阅读!如有任何错误,欢迎您的批评指正!

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值