前言:指针是 C 语言的灵魂,C 语言的精华在于有指针,指针的强大这里就不再强调了。本文主要简单分析动态分配内存后指针变量的地址变化。
案例:要求我们输入 5 个数,然后再将这 5 个数倒序打印出来。
首先给出一段代码,便于我们分析:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int * p = (int *)malloc(5 * sizeof(int));
printf("请输入5个数:\n");
for(i=0; i<5; ++i)
scanf("%d", p++);
for(i=5; i>0; --i)
printf("%d ", *p--); // 14行
return 0;
}
分析:首先我们先动态分配 20 个字节的内存大小来保存我们存入的 5 个 int 类型的数据。指针变量 p 保存的是动态分配内存的第一个字节的地址,由于基类型是 int * ,所以能指向这个 20 个字节的内存。通过循环将输入的 5 个数保存到内存中。
这里主要分析指针 p 的地址变化。通过 Debug 调试。
0、动态分配内存后p的地址为如下:
1、进入循环体,输入第一个数时,p的地址为:
2、输入第二个数时,p 的地址为:
3、输入第三个数时,p 的地址为:
4、输入第四个数时,p 的地址为:
5、输入第五个数时,p 的地址为:
注意:当输完第五个值后,p的地址向后移动一位,此时 *p 的值为 0 ;
所以当我们倒序输出这 5 个值时,第 14 行要注意 *p-- 还是 *--p,前者是先输出 *p 的值然后再 --,后者是先 -- 再取值,这里必须是先向前移动一位然后再取值。