首先看一段代码
#include <stdio.h>
int main() {
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pc);
getchar();
return 0;
}
运行结果为: 可以看到int* 类型的变量pa,和char* 类型的变量pc都可以获取相同的地址,因为在32位系统中,各个指针类型都是4个字节大小。
那为什么还要区分指针类型呢?
1 指针类型决定了解引用操作的时候,能够访问空间的大小
下面用代码进行分析
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int a = 0x11223344;
int* pa = &a;
pa = 0;
getchar();
return 0;
}
可以看到a 的地址存放了初始值 在使用*pa改变了a地址存放的值时,4个字节都变成了0,说明int *类型指针变量可以之间通过地址修改4个字节的值 如果用char * 类型指针变量的话。代码为
#include <stdio.h>
int main() {
int a = 0x11223344;
char* pc = &a;
*pc = 0;
getchar();
return 0;
}
a地址存放的值为 在使用*pc改变了a地址存放的值时,1个字节变成了0,说明char *类型指针变量可以之间通过地址修改1个字节的值
2 指针类型决定了指针步长
看代码
#include <stdio.h>
int main() {
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pa + 1);
printf("%p\n", pc);
printf("%p\n", pc + 1);
getchar();
return 0;
}
运行结果 int * 类型指针加1,跳了四个字节的位置,char * 类型指针加1,跳了一个字节的位置,这就是指针类型决定了指针步长
一个简单的应用
#include <stdio.h>
int main() {
int arr[10] = { 0 };
int i = 0;
int* p = arr;
for (i = 0; i < 10; i++) {
*(p + i) = i;
}
getchar();
return 0;
}
刚开始初始化arr 所有元素都为0 运行程序后arr的值为 由于p是int * 类型的,所以p + i地址每次加4* i个字节,*(p + i) = i,i每次可修改四个字节大小的空间,将值改为i。 假如使用char * 类型的指针变量时
int main() {
int arr[10] = { 0 };
int i = 0;
char* p = arr;
for (i = 0; i < 10; i++) {
*(p + i) = i;
}
getchar();
return 0;
}
每次修改一个字节地址中的值
|