1,加减整数
指针加一,对于数组来说是索引加一。
因为是顺序存储的。
int a[]={1,2,3}
a:第一个元素的指针
a+1:第二个
a+2:第三个
*a:第一个元素的指针指向
*(a+1)
*(a+2)
#include <stdio.h>
int main() {
int arr[] = {
111, 222, 333};
printf("%d\n", *arr);
printf("%d\n", *(arr + 1));
printf("%d\n", *(arr + 2));
return 0;
}
效果:
2,关系运算
对数组来说,后面元素的内存地址是逐渐变大的。
用关系运算可以更方便地遍历。
#include <stdio.h>
int main() {
int arr[] = {
111, 222, 333, 444, 555, 666};
int len = sizeof arr / sizeof arr[0];
for (int *p = arr; p < arr + len; p++) {
printf("%d\n", *p);
}
return 0;
}
效果:
3,指针作差
在数组中,比较两个元素的相对位置。
#include <stdio.h>
int main() {
int arr[] = {
111, 222, 333, 444, 555, 666};
printf("%ld\n", arr - (arr + 3));
return 0;
}
效果:
有人说,这不是废话么,arr-arr-3就是-3呀。
雀食。。。
那我换一种写法。
#include <stdio.h>
int main() {
int arr[] = {
111, 222, 333, 444, 555, 666};
printf("%ld\n", &arr[0] - &arr[3]);
return 0;
}
效果还是-3。
当我有同一数组内,任意两个指针时,由这种方法可以判断相对位置。
4,指针与数组
数组名是首个元素的指针。
#include <stdio.h>
int main() {
int arr[] = {
111, 222, 333, 444, 555, 666};
printf("%d\n", arr[0]);
printf("%d\n", *arr);
printf("%d\n", *&arr[0]);
return 0;
}
效果:
5,多级指针
指针是类型,有指向地址。
那就有指针,指向指针。
那就。。。
有,更多层的套娃。
二级指针:指向指针的指针。
#include <stdio.h>
int main() {
int a = 3;
printf("%d\n", a);
int *b = &a;
int **c = &b;
**c = 7;
printf("%d\n", a);
return 0;
}
效果: