函数与结构体
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数与结构体
写出下面程序的执行结果。
#include <stdio.h>
struct tree
{
int x;
int y;
} t;
void func(struct tree t)
{
t.x = 10;
t.y = 20;
}
main()
{
t.x = 1;
t.y = 2;
func(t);
printf("%d %d\n", t.x, t.y);
screen.pt1 = makepoint(0, 0);
screen.pt2 = makepoint(XMAX, YMAX);
middle = makepoint((screen.pt1.x + screen.pt2.x) / 2,
(screen.pt1.y + screen.pt2.y) / 2);
{
if(*p == 'a' || *p == 'e')
putchar(*p);
else
putchar((*p)--);//putchar不懂的同学请跳转第四页
}
putchar('\n');
}
main()
{
char str[] = "gameover";
print(str);
print(str);
}
(答案:gameover
如果传送给函数的结构很大,使用指针时的效率通常要比拷贝结构时高。结构指针类似普通变量的指针。说明语句:
struct point *pp;
将p p定义成一个指向struct point类型的指针。如果pp指向一个point结构,那么*pp就是该结构,而(*pp) .x和(*pp). y就是结构成员。若要使用pp,例如可以写出如下的语句:
因为结构指针的使用频率很高,于是出现了一种简写方式作为可选的标记法。如果p是结构指针,则p->结构成员表示特定的结构成员。(运算符->是由减号后紧跟>组成的。)因此也可以这样改写:
printf("origin is (%d, %d) \n ", pp->x, pp->y);
.和->都是从左到右结合的运算符,所以如果有说明
struct point origin , *pp;
pp = &origin;
printf ("origin is (%d, %d) \n ", (*pp).x, (*pp).y);
(*pp ) . x中的圆括号是必须的,因为结构成员运算符.的优先级比*高。表达式*pp .x的含义是*( pp .x ),因为x不是指针,所以该表达式非法。
falenueq)
思考:如果将(*p)--换成--(*p)结果会怎样?
函数与字符串
向函数传递字符串与传递结构体类似。最好的方式就是通过引用来传递。
putchar/getchar 简介
由标准库提供的输入输出模型非常简单。文本的输入输出都是作为字符流处理的,不管它从何处输入、输出到何处。文本流是由一行行字符组成的字符序列,而每一行字符则由0个或多个字符组成,并后跟一个换行符。标准库有责任使每一输入输出流符合这一模型,使用标准库的C程序员不必担心各字符行在程序外面怎么表示。
标准库中有几个函数用于控制一次读写一个字符,其中最简单的是getchar和putchar这两个函数。
getchar函数在被调用时从文本流中读入下一个输入字符并将其作为结果值返回。即,在执行
c = getchar ()
之后,变量c中包含了输入流中的下一个字符。这种输入字符通常是从键盘输入的。putchar函数在调用时将打印一个字符。例如,函数
struct rect r, *rp = &r;
那么以下四个表达式等价:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
函数与指针
#include <stdio.h>
void print(char *str)
{
char *p;
for(p = str; *p != '\0'; p++)
temp.x = x;
temp.y = y;
return temp;
}
注意,变元和结构成员同名不会引起冲突,事实上,重名强调了两者之间的关系。
现在可以用makepoint动态初始化任意结构,也可以向函数提供结构类型变元:
struct rect screen;
struct point middle;
struct point makepoint(int, int);
}
为了加深对结构的理解,下面编写几个用于对点和矩形进行操作的函数
把结构体传递给函数的方式有三种:一是分别传送各个结构成员,二是传送整个结构,三是传送指向结构的指针。
一
/* makepoint:通过x、y值确定一个点*/
struct point makepoint(int x, int y)
{
struct point temp;
putchar ( c )
用于把整数变量c的内容作为一个字符打印,它通常是显示在屏幕上。p u t c h a r与p r i n t f这两个函数
可以交替调用,输出的次序即调用的次序。
二
下面通过一系列的函数对点进行算术运算。例如:
/* addpoint:将两个点相加*/
struct point addpoint(struct point p1, struct point p2)
{
p1.x += p2.x;
p1.yຫໍສະໝຸດ Baidu+= p2.y;
return p1;
}
三(在c++中这里用的是“引用”)
写出下面程序的执行结果。
#include <stdio.h>
struct tree
{
int x;
int y;
} t;
void func(struct tree t)
{
t.x = 10;
t.y = 20;
}
main()
{
t.x = 1;
t.y = 2;
func(t);
printf("%d %d\n", t.x, t.y);
screen.pt1 = makepoint(0, 0);
screen.pt2 = makepoint(XMAX, YMAX);
middle = makepoint((screen.pt1.x + screen.pt2.x) / 2,
(screen.pt1.y + screen.pt2.y) / 2);
{
if(*p == 'a' || *p == 'e')
putchar(*p);
else
putchar((*p)--);//putchar不懂的同学请跳转第四页
}
putchar('\n');
}
main()
{
char str[] = "gameover";
print(str);
print(str);
}
(答案:gameover
如果传送给函数的结构很大,使用指针时的效率通常要比拷贝结构时高。结构指针类似普通变量的指针。说明语句:
struct point *pp;
将p p定义成一个指向struct point类型的指针。如果pp指向一个point结构,那么*pp就是该结构,而(*pp) .x和(*pp). y就是结构成员。若要使用pp,例如可以写出如下的语句:
因为结构指针的使用频率很高,于是出现了一种简写方式作为可选的标记法。如果p是结构指针,则p->结构成员表示特定的结构成员。(运算符->是由减号后紧跟>组成的。)因此也可以这样改写:
printf("origin is (%d, %d) \n ", pp->x, pp->y);
.和->都是从左到右结合的运算符,所以如果有说明
struct point origin , *pp;
pp = &origin;
printf ("origin is (%d, %d) \n ", (*pp).x, (*pp).y);
(*pp ) . x中的圆括号是必须的,因为结构成员运算符.的优先级比*高。表达式*pp .x的含义是*( pp .x ),因为x不是指针,所以该表达式非法。
falenueq)
思考:如果将(*p)--换成--(*p)结果会怎样?
函数与字符串
向函数传递字符串与传递结构体类似。最好的方式就是通过引用来传递。
putchar/getchar 简介
由标准库提供的输入输出模型非常简单。文本的输入输出都是作为字符流处理的,不管它从何处输入、输出到何处。文本流是由一行行字符组成的字符序列,而每一行字符则由0个或多个字符组成,并后跟一个换行符。标准库有责任使每一输入输出流符合这一模型,使用标准库的C程序员不必担心各字符行在程序外面怎么表示。
标准库中有几个函数用于控制一次读写一个字符,其中最简单的是getchar和putchar这两个函数。
getchar函数在被调用时从文本流中读入下一个输入字符并将其作为结果值返回。即,在执行
c = getchar ()
之后,变量c中包含了输入流中的下一个字符。这种输入字符通常是从键盘输入的。putchar函数在调用时将打印一个字符。例如,函数
struct rect r, *rp = &r;
那么以下四个表达式等价:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
函数与指针
#include <stdio.h>
void print(char *str)
{
char *p;
for(p = str; *p != '\0'; p++)
temp.x = x;
temp.y = y;
return temp;
}
注意,变元和结构成员同名不会引起冲突,事实上,重名强调了两者之间的关系。
现在可以用makepoint动态初始化任意结构,也可以向函数提供结构类型变元:
struct rect screen;
struct point middle;
struct point makepoint(int, int);
}
为了加深对结构的理解,下面编写几个用于对点和矩形进行操作的函数
把结构体传递给函数的方式有三种:一是分别传送各个结构成员,二是传送整个结构,三是传送指向结构的指针。
一
/* makepoint:通过x、y值确定一个点*/
struct point makepoint(int x, int y)
{
struct point temp;
putchar ( c )
用于把整数变量c的内容作为一个字符打印,它通常是显示在屏幕上。p u t c h a r与p r i n t f这两个函数
可以交替调用,输出的次序即调用的次序。
二
下面通过一系列的函数对点进行算术运算。例如:
/* addpoint:将两个点相加*/
struct point addpoint(struct point p1, struct point p2)
{
p1.x += p2.x;
p1.yຫໍສະໝຸດ Baidu+= p2.y;
return p1;
}
三(在c++中这里用的是“引用”)