求c语言大神解答下面这道题!!!
中输出num的值得时候并不是n的
值,求解,为什么用*num=n可以,而用num=&n就不可以呢?求详细的解答!教会了直接加到100分,图片可以放大看,第一个是题目要求,第二个是编程题 展开
int swap(int a, int b);类似这种函数参数,是值传递,在函数中改变a,b的值,不会改变函数外面的变量内容。
int swap(int *a, int *b);类似这种函数参数,是地址传递,在函数中,改变传入地址所指向的值,则会传递到函数外面。
但是,指针也是一种变量,像这样的赋值num=&n,改变的不是地址指向的存储内容,而是地址本身。它的改变是不会传递到函数外部去的。
2016-12-17
*运算符在进行指针运算的时候做的是取值操作,其实很好理解。
int * n;
就是定义了一个int类型的指针,它可以存放int类型的值的地址,那么就可以用取地址符&将int类型变量的地址取出来赋值给它:
int i = 3;
n = &i;
这时n存放的是i的地址,用*n就可以通过n所存放的地址来找到这个地址所对应的内存然后访问其中的值,通俗理解就是n中只能存放地址,把i的地址给n就必须i过来把地址取出来(&i)告诉n。而赋值之后n只有i的地址并没有i的值,如果需要访问i中的值就必须通过i给它的地址来找到i住的地方,那么这个“找”的操作就是*n。那接下来这条语句:
*num = n;
这就很好理解了,*num就是找到了num所指存放的地址所在的那块区域,然后将n放入这块区域。*num = &n当然是不行的,其实物理上并不是不行,而是逻辑上不允许。*num确实是int型,而地址确实也是可以用int型表示,但仔细想想会很蠢!
int i = 3;
int n1 = i;
int * n2 = &i;
其实再对比一下更好加深理解,int n1 = i;可以理解为重新造了一个房子,然后将i克隆一个放在新的房子中,那么在新的房子中对新的值怎么操作对i其实是没有任何影响的。但int * n2 = &i;就不同了,将i的地址给了n2那么通过n2所存放的地址找到的就是i的家了,那么通过*n2来操作n2所存放的地址所指向的值的时候,操作的就是i的值。
指针的传地址特性在函数中最突出的作用就是可以通过函数来操作传递的参数的值。打个比方
void fun1(int a)
{
a++;
}
和
void fun2(int *a)
{
(*a)++;
}
这两个函数,如果在主函数中定义int a = 1;然后调用fun1(a);最后在主函数中输出a就会发现,a的值并没有改变。而如果调用fun2(&a);的时候就不一样了,它将a的地址发送给了fun2,那么这个函数就可以通过传来的地址直接访问这个地址所指向的区域内存放的值。这一点在今后的学习中会经常碰到也非常有用处,在学了结构体后会发现,有的结构体过大,赋值传参太耗费内存空间的时候经常也会考虑通过地址传递参数。
指针还是很好理解的,但是学习以应用为主,往后面继续去学函数、结构体甚至数据结构,慢慢的对指针就会有更深的理解了,指针只是一个很小的知识点。