关于C语言习题和解释

来源:百度知道 编辑:UC知道 时间:2024/06/19 06:46:37
这是我所不明白的习题,但是我在想了好多次之后还是不会,希望各位指点。
A 有以下程序
#include "stdio.h"
main()
{
int a[]={1,2,3,4,5,6,7,8,9,0},*p;
p=a;
printf("%x\n",p);
printf("%x\n",p+9);
}
若一个int类型的变量占2个字节,第一个printf语句的输出是194,则第二个printf语句的输出结果是( 1 a6 )
但是,我不明白,x是16进制输出地,但是为什么会输出1 a6?再就是16进制是怎样转换的?

B
#include "stdio.h"
main()
{
int a[5] ={2,4,6,8,10},*p,**k;
p=a;k=&p;
printf("%d ",*(p++);
printf("%d\n",**k);
}
程序的输出结果是( 2 4)
但是我想问一下,我是选择(4 4) 的,因为,*(p++)的运算顺序不是先计算p++;因为p是指向a的。所以p此时不是数组a的首地址?所以p++不是因给指向数组的第二个元素?即4?但为什么会是2?再就是**k,不是指向*p的指针,本不是应该和p有同样的值,但是为什么会是与2不同的4? 请详细解释一下,谢谢。。

C
有以下程序
#include “stido.h"
#define N 6
main()
{ char c[N];int i=0;
for (i=0;i<N;i++) c[i]=getchar();
for (i=0;i<N;i++) putchar(c[i]);
}
当运行以上程序时输入三行,每行都是在第一列上开始,<CR>表示ent

A. 第一个printf语句输出的是数组a的首地址,是16进制输出的。
10进制转16进制的方法是用十进制数除16后自下而上取值。
194转换成10进制数是404
int型占2个字节,则p+9表示地址后移9*2位。即404+18=422.这个值以16进制输出,就是1a6。
B. 指针P指向数组a的首地址,对应的值是2.
p++,++在后,则先赋值,再执行p=p+1。则*(p++)这个表达式的值是首元素的值。
**k是指向地址的指针,指向地址p,而P经过上一个运算后已经移向值4了。所以第二个结果是4。
C. getchar()函数是从终端缓冲区读一个字符。按照题目中的输入,终端缓冲区的字符为“a<cr>b<cr>cdef<cr)”
请注意回车也是字符。因为数组只能存入6个字符。则数组中的元素为“a\nb\ncd”,故打出来结果如此。
D. 这题我就不给你详细解释了,每一步值说出来扁幅会很长。只有一点要提醒你。关于自增(++)自减(--)你学得不是很好。++在前,先执行再赋值;++在后先赋值再执行。如int i=10,j=20,c,d;c=i++,d=++j;则c值为10,d值为21.
E. 此程序找出最小值,找到后,打印该值和他的下标。

A.int是两字节,int * p;所以p+9移动了18个字节,即地址增加18
B.int **k = &p;*(p++)的值是*p(++之前的p)即a[0],但此时p指向a[1],又k指向p,所以**k指向a[1]
C.getchar()与scanf不同,你按完一个键后不需要回车来确定输入,每一个键都会被立刻传入,包括回车
D.n++,这个表达式本身的值等于执行此操作之前的n的值,而n的值比原来加1。记住这点,按逻辑想想
E.此程序的作用是找这个二维数组中的最小值,因为m一遇到比自己小的就把它赋给自己,m自然是最小的

你试一下这个程序看看行不行,我也是刚学的,望能够共同探讨,呵呵
#include "stdio.h"
#include"math.h&qu