很多人估计对于指针还是不清楚,那么就来看看一级指针的间接赋值是是如何实现的:
指针是用来干什么的;操作内存块 ,说白点就是赋值,所以间接赋值就是指针重要的特性之一
这里说明一下指针操作的内存块是变量本身的内存块,而并非是为指针新开辟了内存空间;
这么说估计还是有些模糊;那么还是通过代码来说明吧!
#include#include #include void ChangeArray(int *b) { *b = 40;//b 是a 的地址 *b通过地址间接修改a的值 } int ChangeArray2() { int a = 0; a = 50; return a; } void ChangeArray3(int a) { a = 40; } int main() { int a = 0;//建立一个int型变量,欲改变它的值并打印出来 int *b = NULL; //1.直接改变 a = 10; printf("a = %d\n",a);//a = 10 //2.间接改变 b = &a;//将地址赋给指针 *b = 100;//* 就像一把钥匙 通过地址找到内存空间 间接改变了变量的值 printf("a = %d\n",a);//a = 100 //到此时大部分人都能理解 //那么接下来我们进行函数调用 //通过函数进行改变 { *b = 200; printf("a = %d\n",a);//a = 200 }//这样也可以改变变量的值,那么接下来我们将它们运用到函数中 ChangeArray(&a); printf("a = %d\n",a);// a = 40 //此时我们发现可以通过指针在子函数中也可以改变变量 //这时有人会说可以通过return 改变 a = ChangeArray2(); printf("a = %d\n",a);//a = 50 //但是这种做法只能返回一个值,倘若要返回多个值是做不到的; //当然我们可以通过返回结构体来返回多个数值 //可是这样的话编译器就会重行开辟空间,重新进行赋值,就会拖慢运行速度;而指针就是为了解决这个问题才出现的不是么? //当然这个时候肯定会有人认为可以通过形参改变数值 ChangeArray3(a); printf("a = %d\n",a);//这是a 仍然是上次运行的结果 a = 50 //我们发现这样是无法直接改变数值的 system("pause"); return 0; }
现在我们来分析这段代码是如何运行的;首先运行main函数;在栈区为a和b分配内存空间
当运行到ChangeArray*(&a)时,将a的地址传递给了子函数的指针,此时栈区为子函数开辟空间,int *b入栈,*b = 40;,证如同注释一样,b 是a 的地址 *b通过地址间接修改a的值,也可以这样理解 * 就像一把钥匙 通过地址找到内存空间 间接改变了变量的值;此时指针指向的地址是main函数中a的地址;它直接修改了a,运行完毕之后函数被析构掉,子函数中的int *b也被析构掉,但是main中的a值已经改变;
当运行到ChangeArray2()时,这个我想不用解释了,想必大家都看的懂,可能有人会问,返回的值不是被析构掉了么?因为通过return返回值,所以这个数值会被暂时的储存在寄存器中,让后会被释放掉;
当运行到ChangeArray3(a)时:很多人不解为什么值没有改变,明明已经将值赋给参数;参数改变,为何main里的数值不变,因为此时,编译器在栈区为子函数分配空间;int a入栈,然后在子函数的栈区为其分配空间,也就是说main里的a和子函数里的a指向的根本不是同一个空间,那么你修改子函数里的a和main里的a,它们有半毛钱的关系啊?当函数运行完之后就被析构掉了,完全和main里的a不沾边啊;
如果内存四区的模型建立不起来估计很难理解我的意思,前面我对内存四区进行过分析,当然我可能分析的并不好,大家可以自己找资料理解,如果内存四区建立起来了,我想指针这一块就迎刃而解了;