一道c语言题,大神能不能给讲讲为什么还会输出4 3?

作者&投稿:郁洪 (若有异议请与网页底部的电邮联系)
一道C语言题目,求大神给答案~输出是多少?~

在这个程序中主要看哪个static这是静态的意思 也就是说 当fun()函数运算完也不释放x的值 直到mian()函数执行完才释放x的值,这个程序的运行顺序就是,先进入到mian()函数,做循环,s=s+fun()到这句的时候会去调用fun()函数 这是返回x=x+1=2 s=1+2 这时s=3 for循环中i的值自增后
i=2 这时s=3还是满足条件,这样一直循环下去,这个程序感觉不对,这样就死循环了,因为fun()函数中的x值一直没有被释放 第二次执行的时候就变为x=2+1=3了。。这样 主要就是static的作用

#includeint main(){ int i,p[3][3]={1,2,3,4,5,6,7,8,9},*p1[3],(*p2)[3];// 二维数组p有3行,每行有3个整数.// 应该写成int p[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };// p等于0x28fee4,这是十六进制数,是内存地址,从这个内存地址开始,连续存放9个整数.// p[0]等于0x28fee4,这是第0行的首地址,存放1,2,3这三个整数,每个整数占用内存4个字节,// 其中,[0x28fee4]=p[0][0]=1,[0x28fee8]=p[0][1]=2,[0x28feec]=p[0][2]=3// p[1]等于0x28fef0,这是第1行的首地址,存放4,5,6这三个整数,每个整数占用内存4个字节,// 其中,[0x28fef0]=p[1][0]=4,[0x28fef4]=p[1][1]=5,[0x28fef8]=p[1][2]=6// p[2]等于0x28fefc,这是第2行的首地址,存放7,8,9这三个整数,每个整数占用内存4个字节,// 其中,[0x28fefc]=p[2][0]=7,[0x28ff00]=p[2][1]=8,[0x28ff04]=p[2][2]=9 for(i=0;i<3;i++) p1[i]=p[i];// int *p1[3]是"指针数组",是一种"数组",里面存放的是"指针",也就是存放"内存地址".// 定义p1里的数字"3"表示能存放3个"指针",也就是3个"内存地址".// i分别等于0,1,2// i=0时,p1[0]等于p[0]=0x28fee4, p1[0]指向p的第0行的首地址,也就是指向{1,2,3}的首地址.// i=1时,p1[1]等于p[1]=0x28fef0, p1[1]指向p的第1行的首地址,也就是指向{4,5,6}的首地址.// i=2时,p1[2]等于p[2]=0x28fefc, p1[2]指向p的第2行的首地址,也就是指向{7,8,9}的首地址.// p1等于0x28fed8,这是内存地址,// 内存地址0x28fed8里连续存放了三个数据:0x28fee4,0x28fef0,0x28fefc// *p1=*(p1+0)等于0x28fee4,也就是 *p1 = p1[0]=p[0]=0x28fee4// 也就是*p1指向二维数组p的第0行的首地址// *(p1+1)等于0x28fef0,也就是 *(p1+1) = p1[1]=p[1]=0x28fef0// 也就是*(p1+1)指向二维数组p的第1行的首地址// *(p1+2)等于0x28fefc,也就是 *(p1+2) = p1[2]=p[2]=0x28fefc// 也就是*(p1+2)指向二维数组p的第2行的首地址// 所以,p1这个"指针数组",存放了三个内存地址 {0x28fee4,0x28fef0,0x28fefc},// 也就是 {p[0],p[1],p[2]}.// 这三个数据就是三个"指针",也就是三个"内存地址",分别是二维数组p的三行整数的首地址.// 例如,*(p1+1)+0 指向 p[1] 的第0个整数4的内存地址// *(p1+1)+1 指向 p[1] 的第1个整数5的内存地址// *(p1+1)+2 指向 p[1] 的第2个整数6的内存地址// *(*(p1+0)+0) = p[0][0] = 1// *(*(p1+0)+1) = p[0][1] = 2// *(*(p1+0)+2) = p[0][2] = 3// *(*(p1+1)+0) = p[1][0] = 4// *(*(p1+1)+1) = p[1][1] = 5// *(*(p1+1)+2) = p[1][2] = 6// *(*(p1+2)+0) = p[2][0] = 7// *(*(p1+2)+1) = p[2][1] = 8// *(*(p1+2)+2) = p[2][2] = 9 p2=p;// int (*p2)[3]是"数组指针". 语句p2=p表示"数组指针"p2指向二维数据p的首地址.// 定义p2里的数字"3"表示每行有3个整数.// p2等于0x28fee4,这是内存地址,是二维数据p的首地址.// *p2 = *(p2 + 0) = p[0] = 整数p[0][0]的内存地址// *(p2 + 1) = p[1] = 整数p[1][0]的内存地址// *(p2 + 2) = p[2] = 整数p[2][0]的内存地址// *( *p2 + 0 ) = *( *(p2 + 0) + 0 ) = p[0][0] = 1// *( *p2 + 1 ) = *( *(p2 + 0) + 1 ) = p[0][1] = 2// *( *p2 + 2 ) = *( *(p2 + 0) + 2 ) = p[0][2] = 3// *( *(p2 + 1) + 0 ) = p[1][0] = 4// *( *(p2 + 1) + 1 ) = p[1][1] = 5// *( *(p2 + 1) + 2 ) = p[1][2] = 6// *( *(p2 + 2) + 0 ) = p[2][0] = 7// *( *(p2 + 2) + 1 ) = p[2][1] = 8// *( *(p2 + 2) + 2 ) = p[2][2] = 9 for(i=1;i<3;i++) printf("%d,%d
",*(*(p1+i)+1)+1,*(*++p2+1)+1);// i分别等于1,2// i=1时, *(*(p1+i)+1)+1 = *(*(p1+1)+1)+1// 其中,*(p1+1) 等于0x28fef0,也就是 *(p1+1) = p1[1]=p[1]=0x28fef0// 也就是 *(p1+1) 指向二维数组p的第1行的第0个整数的内存地址// 而 *(p1+1)+1 指向二维数组p的第1行的第1个整数的内存地址// *(*(p1+1)+1)就是提取"第1行的第1个整数",也就是// *(*(p1+1)+1) = p[1][1] = 5// 所以,*(*(p1+1)+1) + 1 = 5 + 1 = 6 (这是屏幕输出的第一行第一个整数)// 对于 *(*++p2+1) ,原本是 *( *(p2 + 0) + 1) = p[0][1] = 2// 由于有"++p2"的运算,成为 *( *(p2 + 1) + 1 ) = p[1][1] = 5// 所以, *(*++p2+1) + 1 = 5 + 1 =6 (这是屏幕输出的第一行第二个整数)// i=2时, *(*(p1+i)+1)+1 = *(*(p1+2)+1)+1// 其中,*(p1+2) 等于0x28fefc,也就是 *(p1+2) = p1[2]=p[2]=0x28fefc// 也就是 *(p1+2) 指向二维数组p的第2行的第0个整数的内存地址// 而 *(p1+2)+1 指向二维数组p的第2行的第1个整数的内存地址// *(*(p1+2)+1)就是提取"第2行的第1个整数",也就是// *(*(p1+2)+1) = p[2][1] = 8// 所以,*(*(p1+2)+1) + 1 = 8 + 1 = 9 (这是屏幕输出的第二行第一个整数)// 对于 *(*++p2+1) ,之前i等于1时,是 *( *(p2 + 1) + 1 )// 由于有"++p2"的运算,现在成为 *( *(p2 + 2) + 1 ) = p[2][1] = 8// 所以, *(*++p2+1) + 1 = 8 + 1 =9 (这是屏幕输出的第二行第二个整数)// 所以,程序输出的第一行是6,6, 第二行是9,9return 0;}

输出应该是 2 1 4 3 ,因为main函数中xy和fun函数中xy是颠倒的,不要被xy迷惑了。
可能你不清楚的是最后咋会有4、3,在fun函数中,*x *y是对xy指向的地址赋值,所以推出函数,main函数中xy值还是被改变成4、3了,最后自然输出4、3

因为参数是指针,所以fun函数执行后实参被改了

顺序结构,一行一行往下看

我是pascal语言的


C语言一道题,大神们分分钟搞定
include <stdio.h>typedef struct {int f[4];float a;}sc;int main(){sc s[3],t;int i,j;for(i = 0; i < 3; i ++){s[i].a = 0;for(j = 0; j < 4; j ++){scanf("%d", t.f+j);t.a+=t.f[j];}for(j = i; j > 0; j --)if(s[j-1].a < t.a)...

各位c语言大神来看看这道编程题!!
各位c语言大神来看看这道编程题!!  我来答 首页 在问 全部问题 娱乐休闲 游戏 旅游 教育培训 金融财经 医疗健康 科技 家电数码 政策法规 文化历史 时尚美容 情感心理 汽车 生活 职业 母婴 三农 互联网 生产制造 其他 日报 日报精选 日报广场 用户 认证用户 视频作者...

又一个c语言编程题,求编程大神帮忙啊!
求迷宫问题就是求出从入口到出口的所有路径。在求解时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止 include<stdio.h> include<stdlib.h> define M 15 define N 15 struct mark \/...

C语言 计算机题 求大神解答~
1、能正确表示逻辑关系:“a≥10或a≤0”的C语言表达式是“a>=10||a<=0”。(D选项)解析:“≥”用“>=”表示,“或”用“||”表示。2、判断char型变量c是否为大写字母的表达式是“(c>='A')&&(c<='Z')”。(C选项)解析:大写字母是A~Z,加上单引号,可以直接用来判断是否符合要求...

求大神给我解答一下这道C语言题
首先你需要明白前缀自增运算符和最后自增运算符,前缀是先加后用,后缀是先用后加。然后就是执行while里面的语句的条件是只要不为0即可。现在开始分析程序:a=-2,条件为真,a++,a=-1;++b,b=1,条件为真。执行;语句之后开始下一次:a=-1,条件为真,a++,a=0;++b,b=2,条件为真。执行...

求大神解答一下这道c语言题目
printf(“%c%c\\n”,s1.c[0],*s1.s);输出:ad连续打印两个字符:第一个是s1.c的第一个字符,也就是'abc'的第一个字符:a第二个是s1.s指向的字符,也就是'd'printf(“%s%s\\n”,s1.c,s1.s);输出: abcdef连续打印两个字符串,这个没什么好说的printf(“%s%s\\n”,s2.cp,s2.ss...

C语言的循环题,求大神指导步骤,希望能得到每一步的步骤,尤其是return...
这道题,同 b 数组初始值无关。sub() 函数里的循环:for (i=0;i<3;i++) \/\/ i 是 行 for (j=0;j<3;j++) \/\/ j 是列 { a[i][j]=i+j; \/\/ 元素 a[i][j] 的值等于 行号+列号 if (i==j) s+=a[i][j]; \/\/ 行号等于列号时(就是对角线元素),把元...

几个简单C语言编程题目,自己太笨做不来。求大神解答。速求
1.include <stdio.h>int main(){\/\/求和int i,sum=0;for(i=1;i<=100;i++)sum+=i;\/\/sum就是最后的和printf("1+2+3+...+100=%d",sum);return 0;}2.include <stdio.h>int main(){\/\/最大最小值int a,b,c;int max,min;scanf("%d,%d,%d",&a,&b,&c);max=min=a;\/\/...

一道c语言逻辑题目,求大神帮一下!
逐一验证即可,伪代码 实验代码:include<stdio.h> int main() { int res; \/\/res记录做好事的人,1表示A,2表示B,3表示C,4表示D \/\/假设A说的是真的,验证:res = 4;if (res != 4 && res != 2){ printf("A is true!");return 0;} \/\/假设B说的是真的,验证:res = 1;i...

求大神帮我解释一下这道C语言题,为何输出这种结果
这个调用两次fun,分别为fun(11),fun(2),应该能理解吧。当调用fun(2)时if不成立了,递归结束,执行后面的printf,即输出2。然后返回上级递归即fun(11),执行fun(11)的printf

双阳区18147556971: 这是一道关于c语言的题,求高人详细解释一下为什么第8道题b不对?第7道题我直接看不懂.高分采纳! -
卫钞馨迪: 第六题:输入的时候,格式要与“”间的格式一致,因此中间加了逗号的不对;第七题:这是一个结构体的题目,初始化时...

双阳区18147556971: 一道C语言题谁会,给我讲一下,为什么是那样写的,给注释一下.重重有赏... -
卫钞馨迪: #include<stdio.h>#include<string.h>#include<vector>#include<cctype>void fun ( char *p ){ int k = 0; //k为标识 for( ; *p; p++ ) //依次读取字符串的内容 /********found********/ if( k ) //当k为1时进行以下操作 { if(*p==' ') //读取到当前p的值,如果为空格符...

双阳区18147556971: 有没有C语言大神可以帮我解释一下这道题哇~ -
卫钞馨迪: 你这道题我前段时间貌似看到过上面fun函数就是当查找到字符串里的*时就将字符串当前位置之后到最后的所有数据都向前移一个元素,这样当前位置的*就被删除掉了你图中画圈的for循环就是把后面元素向前移的,q首先指向当前位置,然后把q+1位置的元素赋值给q所指的元素,这样for循环结束后就相当于把最前面的*删除了.

双阳区18147556971: C语言小题一道,求大神给小白讲讲吧··············· -
卫钞馨迪: 楼主你好~#include<stdio.h> //这里stdio.h中间应该是逗号,估计是手误int main(){int a[10]={1,2,3,4,5,6,7,8,9,0},*p; //声明指针pp=a; //把指针p指向数组a,此时p的值为数组a的首地址,即&a[0],而*p则为a[0]的值printf("%x\n",p); //%x,以16进...

双阳区18147556971: 一道C语言题目,请高手给详细解答: -
卫钞馨迪: 1、从main()主函数开始从上往下执行函数2、执行到调用函数fun()后,结果是a=3,b=4,即px=3,py=43、由于是px、py是指针,px和 x指向同一个地址, py 和y也是一样的4、所以输出...

双阳区18147556971: 一道c语言的很简单的题!求大神帮忙解答! -
卫钞馨迪: 像平常数组排序一样.只是赋值的时候用strncpy就可以排序了.至于插入,,找个空的位置放进去 ,,然后再排一次......如果用链表的话..就构建链表把 都是基本的操作...

双阳区18147556971: 请问一下这道c语言题的答案,并说一下原因. -
卫钞馨迪: A正确.L即表示Long,是长整型的标志.B普通整型C浮点型D科学计数型 长整型和短整型区别在于取值范围:长整型 取值范围在[-2147483648,2147483648]无符号长整型 也就是没...

双阳区18147556971: C语言中的一道例题,谁能帮忙详细解释一下每一步的含义? -
卫钞馨迪: 输出为: bcdefgha解释:char *ss( char *s) 函数ss 返回一个指向字符串的指针;函数参数 s 是一个指向字符串的指针这样,在main 中调用 ss(str)后,s指向了s...

双阳区18147556971: 求大神讲解一道C语言程序题 -
卫钞馨迪: 输出结果:_4,_2,12,11 (_代表空格)数组结构如下,例:5是a[1][1],9是a[2][2],11是a[3][1] a[][0] a[][1] a[][2]a[0] 1 2 3a[1] 4 5 6a[2] ...

双阳区18147556971: c语言程序题.求大神解答,并给我讲一讲知道题到底是怎么做的. -
卫钞馨迪: 第7题******#i==3时,输出***i==4是,输出***最后·输出#

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网