4道C语言的基础题目,麻烦各位知友帮个忙,刚开始学C

一:
# include "stdio.h"
main()
{
char *a[]={"abcd","ef","gh","ijk"};
int i;
for(i=0;i<4;i++)
printf("%c",*a[i]);
printf("\n");
}
输出结果是aegi 为什么只是输出了每一行的首个字母呢?

二:
# include "stdio.h"
main()
{
char a[11]="0123456789",*p;
p=&a[4];
puts(p);
}
为什么结果是456789 不是4 吗?

三:int a[2][3]={2,4,6,8,10,12};
则 *(&a[0][0]+2*2+1) 是不是表示 a[1][2] ,为什么?

四:若有以下调用语句,则不正确的fun函数的首部是()
main()
{...
int a[50],n;
...
fun(n,&a[9]);
...
}

A) void fun(int m,int x[ ])
B) void fun(int s,int h[41])
C) void fun(int p,int *s)
为什么A是错误的呢?

一、printf("%c",*a[i]);表示输出地址a[i]所在的字符,如果你想输出字符串,就必须改成printf("%s",a[i]);或者是puts(a[i]);
二、你的代码中指针p是指向a[4]的地址,而输出语句中,是输出指针p的数据,所以输出的是a[4]以后的数据,也就是456789。如果你想输出0~9,那么就要把指针p指向a[0]的地址。
三、在数组a[2][3]中a[0]代表第0行,而a[0][0]代表第0行第0列,所以&a[0][0]表示0行0列的地址,也就是数组a[2][3]第一个数的地址,而&a[0][0]+2*2+1表示从a[0][0]地址开始,往后推五位,也就是a[1][2]的地址,所以*(&a[0][0]+2*2+1)表示a[1][2]的值。
四、因为调用fun函数时传进去的是整数n,和a[9]的地址,所以在定义fun函数时,括号里定义的数组必须有明确的范围,与调用fun函数时一致,以免出错!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-15
一、a[0] = "abcd",
a[1] = "ef",
a[2] = "gh",
a[3] = "ijk";
那你*a[i]就是每一个字符串首地址的字符了。如果要输出每个字符串,可以:
for(i=0;i<4;i++)
printf("%s",a[i]);
二、p是一个字符指针,首地址为&a[4],puts(p)就是输出p指向的字符串。
如果要输出a[4],需printf("%c\n",*p);
三、是。因为&a[0][0]是取首地址,然后&a[0][0]+2*2+1就是加了5个int型,20个字节,就得到了
a[1][2]的地址。
四、A是传的一个数组,运用的时候是传一个地址,是一个数,h[41]是一个整数,*p也可以接受一个地址。其实A用起来也可的。
第2个回答  2013-01-15
一:
# include "stdio.h"
main()
{
char *a[]={"abcd","ef","gh","ijk"};
int i;
for(i=0;i<4;i++)
printf("%c",*a[i]);
printf("\n");
}
输出结果是aegi 为什么只是输出了每一行的首个字母呢?
printf("%s",*a[i]);应使用%s来输出字符串

二:
# include "stdio.h"
main()
{
char a[11]="0123456789",*p;
p=&a[4];
puts(p);
}
为什么结果是456789 不是4 吗?
p=&a[4];

p的地址取到了a+4,输出的结果从第五个字符开始!

三:int a[2][3]={2,4,6,8,10,12};
则 *(&a[0][0]+2*2+1) 是不是表示 a[1][2] ,为什么?
因为C是按行来排的a[1][0]==a+3,a+5==a[1][2]

四:若有以下调用语句,则不正确的fun函数的首部是()
main()
{...
int a[50],n;
...
fun(n,&a[9]);
...
}

A) void fun(int m,int x[ ])
B) void fun(int s,int h[41])
C) void fun(int p,int *s)
为什么A是错误的呢?
A) void fun(int m,int x[ ])要求的是int数组,调用传的是一个数组元素
第3个回答  2013-01-15
一、printf("%c",*a[i]);
%c是字符 %s才是字符串
二、puts函数是输出字符串到标准输出设备
三、&a[0][0]是a[0][0]的地址。二维数组多个元素,在内存中是线性排列。往后移5个整型单元,得到a[1][2]的地址。然后再用*号取这个单元。
四、A B C都是正确的。fun(n,&a[9]);语句中,实参&a[9]是整型变量的地址,是int * 型。所以C是正确的。A B中的形参int x[]和 int h[41],并非真的数组。x和h都是int *型的指针。而且它们的值是可变的。
第4个回答  2013-01-15
1.char *a[]={"abcd","ef","gh","ijk"};定义了一个数组a[],其元素为char*
printf("%c",*a[i]);就是输出单个字符。实际就是输出每个char*元素指向字符串的第一个字符

2.puts函数原型为int puts(char *string);遇到string指向char为\0返回。

3.*(&a[0][0]+2*2+1)是&a[0][0]地址加5,二维数组在内存上的储存等效于一维。

4.A选项参数为数组的首地址,fun(n,&a[9]);&a[9]是一个整型数的地址,答案为C
第5个回答  2013-01-15
第一题:char a[]是定义数组,而*a[]是定义数组指针,意思是a[0],a[1],a[2]……都是指向数组指针代表的数组的第一个数组的首个地址,如此处a[0]就是指向"abcd"这个char数组保存的首个字母a的地址,a[1]则是指向ef中的e,所以输出的时候只输出一个,如果想输出第二个可以 printf("%c",*(a[i]+1))
第二题:同样的道理,但put会输出该指针指向的数组以及之后位置的数组所保存的值
第三题:只要记住*(a[i]+b)表示a[i]数组之后的b个数组于是,如*(a[1]+2)表示a[3]。另外需要知道的是二维数组其实同一位数组存储方式一样,如a[2][2],和b[4],这里a[0][0]就是b[0],a[0][1]就是b[1],所以a[0][0]+5楼主可以想到,就是a[5]的位置也就是对应的a[2][3]的第五个,a[1][2]
第四题,也感觉是b,h[41]是值,&a[9]地址,形参和实参类型不符,
相似回答