user-0 提问: 指针的不解

回复:
user: user-1
content: 引用 15 楼 super_admi 的回复:再更正： #include <stdlib.h> void Exchange(int *&a, int *&b) {     a = b;//把b指针指向的内存地址赋给a。 }   void main() {     int *a = NULL;     int *b = ( int *) malloc(sizeof(int));     *b = 5;     Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？ }  [quote=引用 3 楼 daxiaoyuyu 的回复:] 更正： #include <stdlib.h> void Exchange(int *a, int *b) {     a = b;//把b指针指向的内存地址赋给a。 }   void main() {     int *a = NULL;     int *b = ( int *) malloc(sizeof(int));     *b = 5;     Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？ } //但是函数返回后，a依然为NULL，请问这是为什么呢？[/quote]  经测试，a不为NULL，*a等于5

user: user-2
content: 再更正： #include <stdlib.h> void Exchange(int *&a, int *&b) {     a = b;//把b指针指向的内存地址赋给a。 }   void main() {     int *a = NULL;     int *b = ( int *) malloc(sizeof(int));     *b = 5;     Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？ } 引用 3 楼 daxiaoyuyu 的回复:更正： #include <stdlib.h> void Exchange(int *a, int *b) {     a = b;//把b指针指向的内存地址赋给a。 }   void main() {     int *a = NULL;     int *b = ( int *) malloc(sizeof(int));     *b = 5;     Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？ } //但是函数返回后，a依然为NULL，请问这是为什么呢？

user: user-3
content: 引用 8 楼 zhao4zhong1 的回复: 引用 楼主 daxiaoyuyu 的回复:指针的不解：我希望用a指针指向b指针指向的内存，为什么下面的做法不可以？ #include <stdlib.h> void Exchange(int *a, int *b) { 	a = b;//把a指针指向的内存地址赋给。 }  void main() { 	int *a = NULL; 	int *b = ( int *) malloc(sizeof(int)); 	*b = 5; 	Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？}  指针也是一种数据类型,int* 看做一种数据类型就可以了，类似下班的代码一样 void exchange(int a, int b) 	{ 		int c = a; 		a = b; 		b = c; 	}

user: user-4
content: 要传二级指针进去

user: user-5
content: 指针变量a在定义时一定要初始化；C语言基础中就是这样规定的，否则要出错；

user: user-6
content: C只有传值。

user: user-7
content: 问你几个问题?你思考下~ 敢问你   exchange 函数中的  a ,b 内存分配在哪里呢? 函数exchange中  的a ,b 内存分配在哪里? 函数执行过后 a  和  b还存在吗? 你仅仅改变a的意义何在?

user: user-8
content: 引用 2 楼 falcomavin 的回复:因为函数形参是一份copy 要达到目的可以用二级指针或者指针的引用 解法一： void Exchange(int **a, int **b)  {     *a = *b;}  解法二： void Exchange(int *&a, int *&b) {     a = b;} 引用 3 楼 daxiaoyuyu 的回复:更正： #include <stdlib.h> void Exchange(int *a, int *b) {     a = b;//把b指针指向的内存地址赋给a。 }   void main() {     int *a = NULL;     int *b = ( int *) malloc(sizeof(int));     *b = 5;     Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？ } //但是函数返回后，a依然为NULL，请问这是为什么呢？ 还有什么需要更正的呢，楼上的回复你看都不看，人家说的很清晰明了！

user: user-9
content: 错在函数参数传递传的是值的副本,这里指针也是传的是地址值的副本.

user: user-10
content: c 的本质是传值  个人觉得 林锐的 高质量c/c++ 编程讲得很好

user: user-11
content: 引用 2 楼 falcomavin 的回复:因为函数形参是一份copy 要达到目的可以用二级指针或者指针的引用 解法一： void Exchange(int **a, int **b)  {     *a = *b;}  解法二： void Exchange(int *&a, int *&b) {     a = b;} 解法一： void Exchange(int **a, int **b)  {     *a = *b;} main调用： Exchange(&a,&b);  解法二（老的C编译器不支持，C++编译器应该都支持） void Exchange(int* &a, int* &b) {     a = b;}  main调用： Exchange(a,b);

user: user-12
content: #include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-13
content: swap(a, b) { t = a a = b  b = t } //没有成功交换  这个楼主能理解吧。那么你的exchange（a,b）和这个是一样的。只不过你的a，b是int*类型.swap（a,b)的a,b是int型的。

user: user-13
content: 引用 2 楼 falcomavin 的回复:因为函数形参是一份copy 要达到目的可以用二级指针或者指针的引用 解法一： void Exchange(int **a, int **b)  {     *a = *b;}  解法二： void Exchange(int *&a, int *&b) {     a = b;} ++用引用或者指针

user: user-14
content: 经常看见 说着指针不解 指针很难  其实 你不懂的东西是 函数参数传递 和 指针 没什么必然联系 指针:真是无妄之灾 函数参数:谢谢你帮我背黑锅了  C函数参数只有值传递  其实学函数的时候 早就将结果你这种写法 swap(a, b) { t = a a = b  b = t } //没有成功交换  你这里的写法是     int *a = NULL;     /*Exchange(a,b);函数调用其实是*/     Exchange.a = main.a //参数传递     Exchange.b = main.b //参数传递     Exchange.a = Exchange.b //函数执行 }//函数调用解释     //以上代码中 针对main.a的赋值只有 = NULL 这一次 其他时候最多也只是把main.c写在赋值符号右边一直没有修改main.a的值

user: user-15
content: Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？  exchage这个函数传入的a并不是你在main中的a，而是它的一份copy，你在exchange里面改变的是copy的值，main中的a从头到尾都没有变

user: user-0
content: 更正： #include <stdlib.h> void Exchange(int *a, int *b) {     a = b;//把b指针指向的内存地址赋给a。 }   void main() {     int *a = NULL;     int *b = ( int *) malloc(sizeof(int));     *b = 5;     Exchange(a,b);//但是函数返回后，a依然为NULL，请问这是为什么呢？ } //但是函数返回后，a依然为NULL，请问这是为什么呢？

user: user-15
content: 因为函数形参是一份copy 要达到目的可以用二级指针或者指针的引用 解法一： void Exchange(int **a, int **b)  {     *a = *b;}  解法二： void Exchange(int *&a, int *&b) {     a = b;}

user: user-16
content: void Exchange(int **a, int **b) {    // do something } // 调用  Exchange(&a, &b);   ps：指针的地址也是值，地址值也只是作了拷贝那份的赋值操作而已，本身还是没变！