概念:
指针即地址,内存空间被地址划分,内存中的内容均可以使用地址来表示,找到地址就可以找到内存中存放的内容。
指针变量即存放地址的变量。
运算符*:取指针变量中地址存放的内容;运算符&:取变量存放内容的地址。
代码应用:
1.在普通变量上的应用
int num = 9;
printf("int value is %d \n", num);
printf("int point is %p \n", &num);
//定义int类型的指针变量
int* num_p = #
//打印变量存放的内容
printf("point for num_p %p \n", num_p);
//使用* 取内存地址中存放的内容
printf("value for num_p %d \n", *num_p);
打印结果如下:
int value is 9
int point is 00B9FB88
point for num_p 00B9FB88
value for num_p 9
分析:num打印它在内存中存储的值,&num打印存储此变量值的内存地址。
2.在数组上的应用:
int arr[] = {1,2,3,4};
for (size_t i = 0; i < 4; i++)
{
printf("arr traversal with position %d,value %d \n", i, *(arr+i));
}
printf("arr %p \n", arr);
printf("arr[0] %p \n", &arr[0]);
printf("&arr %p \n", &arr);
打印结果:
arr traversal with position 0,value 1
arr traversal with position 1,value 2
arr traversal with position 2,value 3
arr traversal with position 3,value 4
arr 012FFE14
arr[0] 012FFE14
&arr 012FFE14
分析:数组变量(别名)即数据第一个元素的内存地址,arr=arr[0]=&arr。
3.malloc动态开辟堆空间
void dynamicAction() {
for (size_t i = 0; i < 4; i++)
{
int* arr = (int*)malloc(1 * 1024 * 1024);
printf("arr自己的内存地址 %p ,arr在堆空间的内存地址%p \n", &arr,arr);
}
}
执行结果:
arr自己的内存地址 00BBF600 ,arr在堆空间的内存地址00E04040
arr自己的内存地址 00BBF600 ,arr在堆空间的内存地址01413040
arr自己的内存地址 00BBF600 ,arr在堆空间的内存地址01523040
arr自己的内存地址 00BBF600 ,arr在堆空间的内存地址01631040
分析:malloc在堆内存中开辟空间后将堆空间的地址返回,由于arr属于指针变量,所以它存储的是malloc开辟的堆地址,同时此变量又有它对应的内存地址;即arr=堆空间开辟内存地址(值),&arr=此变量在栈中的内存地址(存储值的内存地址);由于没有释放堆空间,所有每次开辟获取到的地址都不一样(arr),而由于arr变量名没有变,所有它对应的内存地址也没有变。