这个C语言题怎么做?那个 int k=7怎么在主函数,定义函数外面,而且结果为什么是那样?

问题描述:

这个C语言题怎么做?那个 int k=7怎么在主函数,定义函数外面,而且结果为什么是那样?

 


1个回答 分类:综合 2014-11-10

问题解答:

我来补答
k是全局变量,可以在定义的地方到程序结尾的任意函数内调用.一般全局变量是数组,为了防止爆栈(这个你以后会知道).当某个函数内定义了相同的变量时,会在这个函数内使用函数内定义的,否则使用全局的.(定义(名称)相同的变量容易出错(其实是按照两个变量来存储的,涉及到堆栈,了解即可),请尽量避免)
首先不得不说我也是长见识了.这个程序让我也学到不少.
原来在函数内传指针是绝对引用,作用类似于int f(int &a).这是int型的绝对引用方式
相当于在函数内改变这个值时,调用这个函数的函数内相应的值也会改变
这样来按步骤说一下吧
i=3,*p=3 **r=3
进入f函数
s就是r
*t=7
*s=*r=p=t *p=7
这里比较关键,*s=r 的意思是s所指的变量(p)赋值为r,即p所指的东西改变为7
输出.
结束分析
讲的可能有一点跳跃,
再问: 可能跳跃的幅度太大了,按步骤分析没看懂啊
再答: 昨天晚上有点赶。。
是这样子的,i是int型变量,p是指向int型变量的指针,r是指向*int型的指针(这里有点逗。。)
*p指向的是一个int,*r指向的是一个*int,**r指向的是一个int(这里一定要理解!)
好。。我们从主函数进行分析
第一行:定义变量,i=3,*p=3,*r=p(即**r=3)
第二行:引用f函数
这里注意,我们传入f函数的是r,而根据我对程序运行的观察,对于所有传入函数的指针,在函数内的改变会反应到传入的变量上。分段输出后,可以发现它是这样改变的:把*s(就是p)换成t,这样指向p的r会指向改变值的p上

进入f函数
第一行:定义t,*t=7
第二行:赋值,*s=t(这里改变r的步骤是按顺序的:p=t,所以*p=*t=7,然后又因为r指向p没有变,所以*r=p,**r=*p=7)
第三行:输出“7,7,7,”
回到主函数
第三行:输出"3,7,7\n"
这样应该比较清楚了吧
顺便讲一下昨天我讲的步骤分析有一小部分是错的,这是改正后的
如果有不懂请追问。。指针什么的还是搞清楚比较好
再问: 还有那个全局变量k=7和那种符号常量define k 7 一样不
再答: 不一样。。#define k 7是把所有的k替换成7。。这时如果你有个函数是ok(),那么函数名会自己替换成o7()。。一般来说全局变量在竞赛编程常用(调用方便),真正实际上万行的大程序很少使用(相对而言容易重名出错)。。#define连竞赛都不太常用(容易出错),更不用说大程序了。。
再问: 再问一道关于C语言地址传递的题?*t的值为什么是5,k,*t,**s的值为什么都是3
再问:
再答: Orz刚做了一遍,一开始也是错了

是这样的。。
s=&t和*s=t这两者的不同是没有改变p的值
上一道题,*s=t改变了p的值,那么指向p的r也是会改变的
这题中,s=&t没有改变p的值,对p不会构成影响,r的值也不会改变
(其实我做这种读程序也是很烂的囧)
不懂请追问
P.S.下次的图请转成正的,电脑看会舒服一点。。
 
 
展开全文阅读
剩余:2000
也许感兴趣的知识