目录
指针所占内存空间的大小
任意指针变量在32位平台下是4个字节:
任意指针变量在64位平台下是8个字节:
疑问:那既然指针变量的大小在32位/64位平台下都是4/8个字节,那为什么不同类型数据的地址要用不同类型的指针变量接收呢?
指针类型的意义
举例说明:
#include<stdio.h>
int main()
{
int a = 0x11223344;
int* pa = &a;
*pa = 0;
return 0;
}
int a = 0x11223344;
0x表示十六进制数字,一个十六进制数字代表4个bit位,那么 11223344 这么多个十六进制数字就代表8*4 = 32个bit位, 而int类型的a刚好也是32个bit位,所以 0x11223344 刚好把int类型的a放满
int* pa = &a;
把int类型的a的地址取出来,存放入同类型的指针变量pa中
*pa = 0;
通过pa所存放的地址解引用找到a的空间,并赋值为0
从内存的角度看a的变化:
左侧的 0x012FF724 为a的首地址, 且a为4个字节,所以从 0x012FF724 到下一个地址 0x012FF728 相差了4个字节
或者可以将内存的列数显示为1,可以更直观的看到a所占内存空间
当程序继续往下运行,通过pa是否能改变a的值
a的值确实通过pa解引用改变了
当pa的指针变量类型改为char*时,是否还能改变a的值呢?
#include<stdio.h>
int main()
{
int a = 0x11223344;
char* pa = &a;
*pa = 0;
return 0;
}
同样通过内存查看a的变化
可以看到,只改变了变量a的首地址的值
得出结论:
int*的指针解引用访问4个字节
char*的指针解引用访问1个字节
………………
结论:指针类型可以决定指针解引用的时候访问多少个字节(指针的权限)
指针+-整数
#include<stdio.h>
int main()
{
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("pa = %p\n", pa);
printf("pc = %p\n", pc);
printf("pa+1 = %p\n", pa+1);
printf("pc+1 = %p\n", pc+1);
return 0;
}
将 int类型的变量a 的地址放入 int*类型的指针变量pa 和 char*类型的指针变量pc 中
分别以地址的形式(%p)打印pa和pc,以及pa+1和pc+1
pa和pc:因为指针变量 pa 和 pc 都是存储的a的首地址,所以打印pa和pc是相同的
pa+1:因为pa是int*类型的指针变量,加一表示向后跳过自身长度的一,所以向后跳了4个字节的长度,00AFF850 - 00AFF84C = 4
pc+1:因为pa是char*类型的指针变量,所以加一向后跳了1个字节,00AFF84D - 00AFF84C = 1
得出结论:
指针类型决定了指针+/- 1操作时的步长
整型类型指针+1跳过 sizeof(int) 个字节
字符类型指针+1跳过 sizeof(char) 个字节
………………