一.指针+-整数
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,
cpp
#include <stdio.h>
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
结论:指针的类型决定了指针算法中最小计算单位;
通俗点就是指针的类型决定了指针向前或者向后走一步有多大(距离)。
二.指针的解引用
cpp
#include <stdio.h>
int main()
{
int n = 0x11223344;
char *pc = (char *)&n;
int *pi = &n;
*pc = 0;
*pi = 0;
r
按f10调试时可以看到两者显示的字节数量不同
结论: 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
三.指针和数组
先找到一个例子
cpp
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
结果如下
结论:数组名表示的是数组首元素的地址。
所以就可以这么写代码
cpp
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;
既然可以把数组名当成地址存放到一个指针中,那么显而易见的使用指针来访问一个就成为可能。
cpp
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr)/sizeof(arr[0]);
int i=0
for(i=0; i<sz; i++)
{
printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i);
}
return 0;
}
结论:p+i其实计算的是数组 arr 下标为i的地址。
那我们就可以直接通过指针来访问数组。
如:
cpp
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i<sz; i++)
{
printf("%d ", *(p + i));
}
return 0;
}