目录
开头
大家好,我叫这是我58。今天,我们来介绍一下指针的运算和与之相关的一些东西。
1.什么是指针的运算?
总结
指针的运算,有这三种,分别是"指针 ± \pm ±整数""指针 − - −指针"和指针的关系运算。
指针 ± \pm ±整数
在"指针 ± \pm ±整数"的运算中,返回值见下面的表格。
运算符 | 整数类型 | 返回值 |
---|---|---|
+ + + | 正整数 | 指针从中间往右数第整数位的地址 |
+ + + | 负整数 | 指针从中间往左数第 ∣ | ∣整数 ∣ | ∣位的地址 |
− - − | 正整数 | 指针从中间往左数第整数位的地址 |
− - − | 负整数 | 指针从中间往右数第 ∣ | ∣整数 ∣ | ∣位的地址 |
其中,如果指针 ± 0 \pm0 ±0,就只返回指针的地址,这与数学中的公式 a ± 0 = a a\pm0=a a±0=a(这里的a代指针)是一模一样的,而这时候,就有问题出现了。
这是我58,为什么在
0x0000000000000000
的字符型指针减上1之后就返回0xFFFFFFFFFFFFFFFF
呢?
其实啊,如果看着这上面的图片,就知道为什么在0x0000000000000000
的字符型指针的字符型指针减上1之后就返回0xFFFFFFFFFFFFFFFF
了,因为在这张图片中的"内存"中,如果假设字符型指针的地址为0x0000000000000000
,那么而这个指针从中间往左数的第一位地址为0xFFFFFFFFFFFFFFFF
,所以,这就是在0x0000000000000000
的字符型指针减上1之后就返回0xFFFFFFFFFFFFFFFF
的原因。
指针 − - −指针
在"指针 − - −指针"的运算中,返回这两个指针之间的元素个数,并且,如果这两个指针没有指向同一块空间(比如数组),就会使这个运算出现错误。掌握起来特别简单。
指针的关系运算
在p >= arr
或者p >= pa
(p
、pa
和arr
是一个指针)中,就是指针的关系运算,主要的作用就是用来判断指针与指针的关系。这个不必多讲。
2.指针的运算的实际运用
模拟strlen
函数
c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Strlen(char* str) {
char* p = str;
while ('\0' != *p) {
p++;
}
return p - str;
}
int main() {
char str[] = "Hello,world!!!";
printf("%d", Strlen(str));
return 0;
}
数组全部初始化为0
c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void init(int* arr,int sz) {
int* p = arr + sz - 1;
int* pa = arr;
for (; pa <= p;) {
*pa++ = 0;
}
}
int main() {
int arr[9] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof arr / sizeof arr[0];
int i = 0;
init(arr,sz);
for (i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
return 0;
}
逆序输出数组
c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void reprint(int* arr,int sz) {
int* p = arr + sz - 1;
for (; p >= arr; p--) {
printf("%d ", *p);
}
}
int main() {
int arr[9] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof arr / sizeof arr[0];
int i = 0;
reprint(arr, sz);
return 0;
}
......
结尾
在你看到这之后,可以评论来互动一下我吗?