例题1:加一个类型的长度 地址+1
#include<stdio.h>
#include<string.h>
struct Test
{
int num;
char* pcname;
short sDate;
char cha[2];
short sBa[4];
}* p;
//假设p的值是0x1000000,如下表达式的值为多少?
//已知,结构体Test类型的变量大小是20字节
int main() {
printf("%d\n", sizeof(p)); //32
p = (struct Test*)0x100000;
printf("%p\n", 0x1);
printf("%p\n", p + 0x1); //0x1就是1 ,p+1 这里的1是一个结构体 20个字节 20 要变成16进制变成14(32位) 20(64进制)
printf("%p\n", (unsigned long)p + 0x1); //把p强制类型转换成长整型 再加1, 再转回十六进制 其实也是直接在原地址上加1
printf("%p\n",(unsigned int* )p + 0x1); //同理加一个指针类型 +4就是加一个指针的地址4
/*32
0000000000000001
0000000000100020
0000000000100001
0000000000100004*/
return 0;
}
例题2:+1向后移动一位
#include<stdio.h>
#include<string.h>
int main() {
int a[4] = { 1,2,3,4 };
int* ptr1 = (int*)(&a + 1); //数组的地址加1指向数组最后一个元素的下一个元素地址
int* ptr2 = (int*)((int)a + 1);
//数组首元素地址取整还是一个地址,地址加1 还是在原来的基础上加1,即地址加1向后偏移一个字节
printf("%x , %x", ptr1[-1], *ptr2); //ptr1[-1] = *(ptr1+(-1)) = *(ptr-1)
//ptr1[-1]
//*ptr2 0200 0000
return 0;
}
解释: 低地址 00 00 00 00 | 02 00 00 00 | 03 00 00 00 | 04 00 00 00 高地址
向后移动一个字节 |00 00 00 02| 小端逆序 02 00 00 00
例题3:两个地址之间的差值 就是元素的个数
- 二维数组也是一串连续的地址
例题4:指针+1 与指针类型有关
1.a 数组中元素位指针类型,指针变量a指向数组a首元素地址,
2.pa+1就是 pa的类型char* 向后移动一个char*,指向第二个元素
3.通过%s打印字符指针对应的字符串
例题5:不断的找地址和解引用
- 画图,指针变量指对位置