c语音,初学者求解两道简单的题目,尽量详细点~

阅读程序写结果
#include<stdio,h>
void main()
{
char[][7]={"Teacher","Tom","Good"};
char *p=a[0];
p=p+3;
printf("%s\n%s\n",a[0],p);
}
这一题答案是
TeacherTom
cherTom
我想问的是Teacher后面应该还有一个\0吧?长度应该大于7吧?为什么还能初始化?
然后这个答案怎么来的我也不懂,初学者,求详细解释,谢谢了!!
还有一道姊妹题
#include<stdio,h>
void main()
{
char a[][7]={"Teacher","Tom","Good"};
char (*p)[7]=a;
printf("%s\n%s\n",a[0],++p);
}
这两道题后面的GOOD都到哪去了?还有(*p)[7]和*p[7]的区别?实在不懂。。求指导,悬赏30,我全部的家当了。。。。。。。感激不尽

第一个题目应该这样理解,首先a是一个二维数组,第一维可以认为为指针,指向字符串(或字符数组),Teacher按道理后面应该有个\0,不过这个在初始赋值时应该被覆盖了,而且变成连续的了,其长度若按字符串(strlen)理解确实大于7(为10),按数组理解当然不能超过7了,但是打印的时候是按字符串打印的。 这种初始化算是一种不正确的初始化,应该尽量避免。
所以p+3可以理解为p现在指向第一维的字符串偏移为3的位置处。

第二个题目主要是考虑运算符结合的优先级别的。
(*p)[7],首先是一个指针,他指向数组,这个数组有7个元素。他每次加1相当于加了数组长度7*(sizeof(数组元素类型))。而a此时可以认为数组指针,类型相同,不过a为常量,p为变量。

明显,你现在还没有输出GOOD! ,想输出很简单
printf("%s\n%s\n",a[0],++p);
printf("%s\n",++p);

*p[7],首先是一个数组,他的元素是7个指针。这个可以简单的认为7个连续的指针。

这样应该算是清楚了。。。。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-01
char a[][7]申请的是连续的一块内存,程序是不会检查数组是否越界的,因为teacher无\0而tom有,所以不输出good
第2个回答  2012-12-01
char[][7]={"Teacher","Tom","Good"};
这个变量名也没有,就是有变量名,也会报错的
error: initializer-string for array of chars is too long

不知道,你编译过没,答案怎么出来的。
第3个回答  2012-12-01
char[][7]={"Teacher","Tom","Good"};
这个只是初始化,按照规定进行存储!我们计算机会在大二开“数据结构”这门课,讲述的就是怎样存储数据!
存储为
T e a c h e r
T o m \0 \0 \0 \0
G o o d \0 \0 \0
char *p=a[0];
p指针指向T,printf(“%s”,p);是字符串输出,直到遇到\0停止。当字符串没有终止符时,向后寻找,直到找到\0为止。
p定义为char *p=a[0]类型,所以p=p+1,就是p指向下一个char内容!
char (*p)[7]是定义指向字符数组的指针,p=p+1,p指向跳过后面7个char类型的数,即p=&a[1][0];
char *p[7]是定义连续的7个指针的一维数组,即p[0]=&a[0][0],p[1]=&a[0][1]。
所以第二题为
TeacherTom
Tom
第4个回答  2012-12-01
其实您已经接近答案了。
char a[][7]={"Teacher","Tom","Good"};在内存中的布局是:
'T''e''a''c''h''e''r''T''o''m''\0'(然后三个位置没有用)'G''o''o''d''\0'(然后2个位置没有用)
为什么能初始化,因为编译器不会检查您赋值的边界问题,它只会检查您的语法是否符合语义要求。
所以输出a[0]的话就会输出TeacherTom,因为r后面没有'\0',会继续输出,直到'\0',而Tom的m后面刚好有'\0',所以输出上述答案就是正确的了。
p=p+3,所以p指向Teacher中的'c'所以输出p会输出cherTom。答案是ok的。
char (*p)[7]是指p指向一个有7个元素的数组,而
char *p[7]是指一个数组有7个元素,每个元素都是指向char值的char*指针。追问

为什么TEACHER后面没有\0而TOM后面有啊?就是不知道这个。。。是不是TEACHER把那一行填满了就不加\0了,而TOM没有填满所以补充了一个\0?

追答

有可能是您说的这种情况,但即便加上了也是在R后面,再赋值Tom的时候T也会覆盖R后面的'\0'。
不管哪种情况,R后面都不会有'\0'。
您的说法可能更准确些,可以试下char a[2][7]={"Teacher"}然后输出a[0]试试看。
经过验证应该是被覆盖了,而不是不添加了。

本回答被提问者和网友采纳

c语音,初学者求解两道简单的题目,尽量详细点~
第一个题目应该这样理解,首先a是一个二维数组,第一维可以认为为指针,指向字符串(或字符数组),Teacher按道理后面应该有个\\0,不过这个在初始赋值时应该被覆盖了,而且变成连续的了,其长度若按字符串(strlen)理解确实大于7(为10),按数组理解当然不能超过7了,但是打印的时候是按字符串打印的。

初学者请教 两道简单的c语言编程题目
1. 用C语言自己的时间函数 difftime(time_t time1, time_t time0) \/ 86400 这样做得缺点是,这里的time_t类型,只支持到2037年 2. 自己定义函数 楼主用的方法,在实际编程里不常用,变化比较大。下面这个方法是直接计算两个日期到公元元年的天数 然后相减,这个是实际编程时的算法,经过很多程序...

急求解两道不难的C语言编程题目
1 include <stdio.h> include <malloc.h> int *g_n;int g_num;void output(){ int i=1;if (g_n[0] != g_num){ printf("%d = %d", g_num, g_n[0]);while(g_n[i]!=0 && i<g_num)printf(" + %d", g_n[i++]);printf("\\n");} } void decompose(int num, in...

C语言编程问题,初学者,麻烦简单些,谢谢
int main(){ int sex,h,h1;float w,x,w0;scanf("%d%f%d",&sex,&w,&h);if(sex==0){ h1=80;x=0.7;} if(sex==1){ h1=70;x=0.6;} w0=(h-h1)*x;if(w>=0.9*w0&&w<=1.1*w)printf("正常体重\\n");else if(w>1.1*w0){ if(w<=1.2*w0)printf("体重过重\\n"...

C语言编程问题,初学者,麻烦简单些,谢谢(*°∀°)=3?
int main(){ int sex,height;float weight,bzweight;\/\/输入体重和标准体重 printf("输入性别(0-男性,1-女性):");scanf("%d",&sex);printf("输入身高(cm):");scanf("%d",&height);printf("输入体重(kg):");scanf("%f",&weight);if(sex==0)bzweight=(height-80)*0.7;else bz...

求C语言题,我是初学者,请讲详细点
C)x=n=1 \/\/很明显,缺少分号,一个语句的最基本要求就是,以分号结束。如果做为一个表达式是合法的,x=n=1同等于 x=1,n=1;D)x=5=4=1;\/\/错误,赋值的最基本要求,被赋值的一定是变量,不能是常量,也就是说左边是变量,右边可以是常量,或者已经被赋值的变量, 因为5 4 都不是变量...

C语言编程问题,初学者,麻烦简单点,可以看懂的,谢谢(*°∀°)=3?_百...
一、a为0,bx+c=0,求得一解。二、a不为0,按照一元二次方程公式:当判别式b^2-4ac,>0则两个解,=0则一个解,<0则无解。最后,代入公式求解。函数参数:a,b,c及存放结果的数组x。返回解的个数。下面是代码:include <stdio.h> include <math.h> int fun(double a,double b,...

初学者求教简单的C语言问题?
问题1:将case 1, case 2, case 3 依次改作case '1',case '2', case '3'就好了。因为scanf("%c",&choice);这句表示choice是以字符形式接收输入的数据,所以case的形式应该也是字符的形式!case部分如下修改就好了 scanf("%c",&choice)while(choice!=‘4’){ scanf("%c",&choice)swit...

求C语言答案!!!坐等!!!高悬赏!!步骤清晰!!!
你是刚学C语言的吧?建议在学习的时候同步观看 徐洪波老师的C语言程序设计视频教程,百度上去搜索下载即可,这套视频极适合C语言初学者学习!保证学完之后,C语言不说登峰造极了,也绝对是高手一个!当然了,若想成为C语言的强者,还有很多路要走。下面就对这两道题做一解释。先声明:代码有很多可优化...

求解两道C语言问题(英文)
第一题 (a) 关键字:double, return (b) 标准的标识符:time, G, xyz123, this_is_a_long_one (c) 通常用于宏名称:MAX_ENTRIES (d) 其它有效的标识符:Void, MAX_ENTRIES, printf (e) 无效的标识符:Sue's, part#2, "char", #insert 第二题 这题题目肯定有问题,卫星又不是贴着...

相似回答