目录
目录
前言
为什么005-2,因为我觉得我懂了,当开始007结构指针这篇笔记时,我还是晕了。各方查看资料,最终开单章笔记来加深对指针运用的理解。
正文
没有对比就没有伤害!请看下面哪个代码ab会改变?
代码1:
#include <stdio.h>
void Swap(int a, int b)
{
int buf = a;
a = b;
b = buf;
}
int main(int argc, char *argv[])
{
int a = 3, b = 5;
Swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
代码2:
#include <stdio.h>
void Swap(int* a, int* b)
{
int buf = *a;
*a = *b;
*b = buf;
}
int main(int argc, char *argv[])
{
int a = 3, b = 5;
Swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
以上是经典的指针作为函数参数的对比,结果大家多数能说对或者像我一样能猜对,但是怎么去理解并固化在脑子里就看各人的造化了。
先看结果:
为什么第一个没变,第二个变了呢?直观的对比就是第一个没用指针,第二个用指针了。
K&R里面说的很直白,“C语言是以传值的方式将参数的值传递给被调用函数的,因此,被调用函数不能修改主调函数中变量的值。”(K&R提到,由于参数传递的是值,所以函数无法直接修改实际参数的值。如果希望函数能够修改实际参数的值,可以通过传递指针的方式实现。)《手把手教你c语言》里说,由于函数是在栈中运行,并且传递是单向的,没用指针时,传的值在被调函数中改过后 就被弹出了,不存在了,主函数没有get到。而用指针传递的是地址,当在被调函数中改变后,被弹出的是地址,改变的结果在主调函数中。
恩,我的理解是,主调函数是儿童,被调函数是成人,参数是手柄。儿童在玩游戏,大人在旁看着,想改变一些操作,在自己脑子里改了,但是只能干着急,孩子游戏还是失败了。但是如果孩子把手柄交给大人了(也就是参数用了指针),那么大人就能改变游戏结果了。参数不是指针,喊破喉咙也没用。参数是指针,你就是游戏,游戏就是你,人游合一,岂不快哉!
后语
1、以上就是屈屈一些拙见了,如果你有所感悟,我的目的也就达到了。
2、顺便提一下,由于《C语言程序设计K&R》与《手把手教你C语言》编写时间受当时技术限制,都有不少问题,《笨办法学C语言》讲的语言规则感觉可以让代码更牢固一点。
3、一本C语言书真的不够,入门尚可,很多不理解的东西,多看看其它书说不定也就理解了。