【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语言标准规定,允许指向数组元素的指针与指向数组最后一个元素之后内存位置的指针进行关系比较,但是不允许与指向首元素之前内存位置的指针进行关系比较。
总结:
本节介绍了指针的运算,包括指针 ± 整数、指针 - 指针以及指针的关系运算。
感谢您的阅读!如有任何错误,欢迎您的批评指正!
标签:初阶,运算,示例,int,C语言,vp,str,指针 From: https://blog.csdn.net/qq_43108974/article/details/137423787