int main() {
int a = 123;
int* p = &a;
char* p_ = &a;
printf("%p\n", p);
printf("%p\n", p_);
}
- 可以看到无论是用 int 类型的指针变量或是 char 类型的指针变量似乎都能接受一个地址,那么指针变量的类型有什么意义呢?
解引用操作的时候,访问空间的大小
- 首先我们设一个 int 类型的变量 a,值是一个 4 字节的数值,我们可以看到在内存中它的表示如图
- 此时用 int 类型的指针变量 p 来指向 a 的地址,
- 最后通过 *p 的解引用操作,我们可以获得 a 变量的值,或者更改 a 变量的值;在本文中我们对 a 的值进行更改,更改后的内存变化如下:
- 清晰的是,由指针变量 p 是 int 类型的,因此它的权限是 4 个字节的数据;如果我们使用 char 类型的指针变量会如何呢?
决定指针向后移动一个单位的距离
int main() {
int arr[5] = { 0 };
int* p = arr;
for (int i = 0; i < 5; i++)
{
*(p + i) = 1;
}
}
- 指定一个长度为 5 的数组,他们的元素都是 0
- 通过指针变量 p 将数组的所有值置 1
- 因为数组是 int 类型的,因此包含 5 个元素的数组是 20 个字节的长度,而 int 类型的指针变量 p 每次向后移动一个单位(即 (p+1))都是向后移动 4 个字节,因此刚好一一对应
- 但如果设置 p 的类型为 char 类型,那么移动五次只能移动 5 个字节,而全部数组涉及 20 个字节,因此改动的结果如下:
|