分享
 
 
 

对C语言结构体知识点的学习以及复习相关基础知识

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

学习笔记:结构体没有学好,遇到的问题太多了,只好返回来再学一次,如果你和我一样,那就一起学吧,如果你是高手,如果你有空的话,就请指点一二,小弟感激不尽哈!~

以下源代码均在VC.NET2003下编译通过!编译环境不同,代码要做部分修改~

(一)结构体数组

#include <iostream>

struct student{

int number;

char name[10];/*注意字符变量的定义,是定义成字符变量,还是字符串变量呢?char name; 与后面的初始化"tang"字符串不一致*/

int code;

}studen[3]={1,"tang",99,2,"tangzhong",89,3,"hua",88};

void main ()

{

for(int i=0;i<3;i++)

{

printf("number=%d ,name= %s ,code=%d",studen[i].number,studen[i].name,studen[i].code );

/*在程序没有错误的时候一定要考虑到输出格式上的错误,开始写成了

printf(%d number= %c name= 这里面有两个错误,一个是%d的位置写错了,造成输出 1 number=,tang name=的格式

另一个错误是%c是字符格式,并不是字符串格式。。请注意*/

printf("\n");

}

getchar();

}

/*这个程序重点学习了结构体数组的初始化,以及结构体变量的引用

学习笔记:

1、结构体定义只是一种数据结构,类似于类CLASS形式的一种数据结构,并不是存在的实体,只是一种自定义的类型

2、结构体变量是这种类型的变量,就像是int n中的n一样只是一个变量,它的值可以像变量一样改变

3、结构体数组是和一般数组类似,只是它的每个元素都具有结构体的结构。

4、得到的想法是:

进一步思考到用结构体去实现线性结构的链表,及其对链表的建立,结点的建健、查找、删除、插入等综合操作。。自己写出这个程序,那么我们的结构体知识点及数据结构的还有相关的基础知识也就撑握得差不多了。我认为是这样的。。所以近来加大了上机力度和时间。。

(二)指向结构体类型数据的指针

/*指向结构体类型数据的指针*/

#include<iostream>

main()

{

struct student

{

long num;

char name[20];

char sex;

float score;

};

struct student stu_1;//定义一个结构体变量stu_1;

struct student *p; //定义一个指向struct student 结构体类型的指针变量p

p=&stu_1;//结构体变量的地址赋给变量p,使指针P指向结构体变量stu_1;

stu_1.num=891001;

strcpy(stu_1.name,"lilin");//注意一个问题,字符串不能直接赋给变量,要用strcpy函数把字符串copy到字符数组里面去!

//上面的这个strcpy(stu_1.name,"lilin");不能写成stu_1.name="lilin"编译会出错

stu_1.sex='M';//字符变量(不是字符串数组)可以直接赋值,但是注意引号是单引号,不能写成这样stu_1.sex="M";

stu_1.score=89.5;

printf("No. :%ld\nname:%s\nsex:%c\nscore:%f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);

printf("No. :%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,(*p).name,(*p).sex,(*p).score);

getchar();

}

/* 首先对指针进行复习:

1、指针变量的定义

(三)指向结构体数组的指针

(四)用结构体变量作函数的指针

/*结构体变量作函数参数*/

#include<iostream>

#define FORMAT "%d\n%s\n%f\n%f\n%f\n"//这里采用了宏不错的想法!方便,记得引用时也要大写。。

//而且后面的参数类型要对上哦!

struct student //结构体类型struct student 被定义成外部类型,同一源文件中的函数都可以用它

//定义结构体变量的类型

{

int num;

char name[20];

float score[3];

};

main()

{

void print(struct student); //声明print函数

struct student stu; //定义结构体student的变量stu;

//给结构体成员赋值

stu.num=12345;

strcpy(stu.name,"lili");

stu.score[0]=67.5;

stu.score[1]=89;

stu.score[2]=78.6;

print(stu);//调用print函数,参数传递是传递结构体变量stu

getchar();

}

void print(struct student stu)//由于结构体struct student被定义为外部类型,所以print函数也可把形参stu定义为struct student类型

{

printf(FORMAT,stu.num ,stu.name,stu.score[0],stu.score[1],stu.score[2]);

printf("\n");

}

(五)用指向结构体的指针作函数参数

/*用指向结构体变量类型的指针作函数的参数*/

#include<iostream>

#define FORMAT "%d\n%s\n%f\n%f\n%f\n"//这里采用了宏不错的想法!方便,记得引用时也要大写。。

//而且后面的参数类型要对上哦!

struct student //结构体类型struct student 被定义成外部类型,同一源文件中的函数都可以用它定义结构体变量的类型

{

int num;

char name[20];

float score[3];

}stu={1245,"lili",67.5,89,78.6};

main()

{

void print(struct student *p); //声明print函数(+++++ void print(stuct student *) 也没有错,也正确++)

print(&stu);//调用print函数,参数是地址,传给print函数的形参指向结构体变量类型的指针P

getchar();

}

void print(struct student *p)//由于结构体struct student被定义为外部类型,所以print函数也可把形参stu定义为struct student类型

{

printf(FORMAT,p->num ,p->name,p->score[0],p->score[1],p->score[2]);

printf("\n");

}

/**学习笔记

有三点值得注意的问题

1、struct student结构体被定义成外部类型,属全局类型,同一源文件中的所有函数都可以用来定义这种结构的变量

2、用指向结构体类型的指针当函的参数的时候,要注意在函数的声明或定义中,要说明形参的类型void print(struct student *p);或void print(struct student *);

3、注意这样的写法

scanf("%d%s%f%f%f",&stu.num,stu.name,&stu.score[0],&stu.score[1],&stu.score[2])

这里面的stu.name前面没有&符号,因为name是一个字符数组,它本身就是地址,所以不用加

用指针作函数的参数,能提高运行效率。。。。。。。。。。。。。。。。。。。。。。。。

(六)用结构体实现简单链表

#include <iostream>

#define NULL 0

struct student

{long num;

float score;

struct student *next;

};

main()

{

struct student stu_1,stu_2,stu_3;//定义了三个结构体struct student 变量

struct student *head,*p;

head=&stu_1;//让head指针指向链表的第一个结点;

stu_1.num=99901;stu_1.score=89.5;stu_1.next=&stu_2;

stu_2.num=99902;stu_2.score=87.6;stu_2.next=&stu_3;

stu_3.num=99903;stu_3.score=88.4;stu_3.next=NULL;

p=head;//P指向第一个结点

for(int i=0;i<3;i++)//用FOR循环,因为我已知道有多少个结点,null这个值没有用上。当不知道有多少结点的时候,要用循环while

{

printf("num=%ld,score=%f\n",p->num ,p->score );

p=p->next;//第一个结点数据输出后,让P指向第下一个结点

};

getchar();

}

/*这是一个静态链表,完全由自己从头书写,

学习笔记:

1、最后的链表输出是已知链表结点数,所有用了FOR循环

最好应该用while循环

do

{

printf("num=%ld,score=%f\n",p->num ,p->score );

p=p->next;//第一个结点数据输出后,让P指向第下一个结点

while(p!=NULL);

*/

学好了这些东西,才可以进行动态链表的程序设计。。。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有