对于初学者也包括我来说指针不就是来存放地址的吗 应该会有一个疑惑 为什么还有那么多类型char* int*等等不都能存放一个地址无论是整形还是字符 那这个指针类型能有什么意义呢
有的有的兄弟 他的真正意义就在于解引用上面*p
指针类型决定了 指针进行解引用操作时 一次能访问几个字节的空间 是访问权限的大小
比如char*的指针 解引用访问1个字节的空间
比如int* 的指针 解引用访问4个字节的空间
比如double*的指针 解引用访问8个字节的空间
...........
接下来给出一段代码实例
#include<stdio.h>
int main()
{
int a = 0x11223344;
char* pa= &a;
*pa = 0;
return 0;
}
我们调试起来看内存的情况 找到a的地址
可以看到a再内存中的存储是倒着放的 在小端存储中是这样的 大端存储就是正着放的了
继续往下走到*pa = 0;这一步完成之后 a的内存存贮会发生这样的变化
44 变成了 00 那为什么不是全变成0呢
这就是指针类型在搞鬼 我们知道16进制的数字中2位代表一个字节的大小 char*解引用时正好访问一个字节的大小的权限 只改变44就说的通了
指针的类型也决定了指针的步长针对的是指针变量的本身(指针+1跳过几个字节的长度)
字符指针+1,就跳过1个字节
整形指针+1,就跳过4个字节
.................
代码展示
#include<stdio.h>
int main()
{
int a = 0x11223344;
char* pa= &a;
for (int i = 0; i < 2; i++)
{
*pa = 0;
pa++;
}
return 0;
}
a的在内存中的存储变化↓
循环两次只改变两个字节的存储情况
实质上还是地址的变化
#include<stdio.h>
int main()
{
int a = 0x11223344;
int* pa = &a;
printf("%p\n", pa);
printf("%p", pa + 1);
return 0;
}
在16进制中c代表12
8 + 4 = 12 正好跳过四个字节