在C语言中,指针和数组名通常都可以混用。 例如 char *p; 访问时,*p跟p[0]是一样的,*(p+1)跟p[1]是一样的。 对于数组 char b[5]; 访问时,b[0]跟*b是一样的,b[2]跟*(b+2)是一样的。 在一般的通信中(例如串口),通常都使用字节传输。而像float,long int之类的, 有4字节。我的方法就是取它的地址,强制转换为char型指针,然后当作数组来用。 float x; SBUF=((char*)&x)[0]; SBUF=((char*)&x)[1]; SBUF=((char*)&x)[2]; SBUF=((char*)&x)[3]; 接收时,刚好倒过来。 更有趣的是,对于数组形式,数组名和后面的偏移量可以随便换。 char buff[10]; //或者用 char *buff=&buffer; buff[3]=0xaa; 3[buff]=0xaa; //两者是一样的 因此,我认为编译器是这么做的:对于形如xxx[yyy]这样的表达式,会转化为*(xxx+yyy), 因此写成xxx[yyy]或者写成yyy[xxx]都无所谓了... c语言 结构体与共用体学习笔记1 Author:yuexingtian Date:Thursday, June 12, 2008 测试结果: /*给结构变量赋值并输出其值*/ main() { struct stu { int num; char *name; char sex; float score; }boy1,boy2; boy1.num=15; boy1.name="yuexingtian"; printf("input sex and score\n"); scanf("%c %f",&boy1.sex,&boy1.score); boy2=boy1; printf("Number=%d\nName=%s\n",boy2.num,boy2.name); printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score); getch(); } | |
说明: 本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。用scanf函数动态地输入sex和score成员值, 然后把boy1的所有成员的值整体赋予boy2。最后分别输出boy2的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。 2结构变量的初始化 对结构变量的初始化(还拿上例举例) 程序如下: main() { struct stu /*定义结构物探化探计算技术*/ { int num; char *name; char sex; float score; }boy2,boy1={15,"yuexingtian",'m',88.8}; boy2=boy1; printf("Number=%d\nName=%s\nSex=%c\nScore=%f", boy2.num,boy2.name,boy2.sex,boy2.score); getch(); } | |
测试结果: 内部质量保证体系说明: 本例中,boy2,boy1均被定义为外部结构变量,并对boy1作了初始化赋值。在main函数中,把boy1的值整体赋予boy2, 然后用两个printf语句输出boy2各成员的值。 3结构数组的定义 例1、计算学生的平时成绩和不及格的人数 struct stu {
int num; char *name; char sex; float score; }boy[6]={ {101,"yuexingtian",'M',88}, {102,"yuechaotian",'M',98}, {103,"tianyuexing",'M',96.5}, {104,"tianyuechao",'M',99.5}, {105,"tianjingli",'F',59.5}, {106,"tianjingshan",'M',58}, }; main() { int i,c=0; float ave,s=0; for(i=0;i<6;i++) { s+=boy[i].score; if(boy[i].score<60) c+=1; } printf("s=%f\n",s); ave=s/6; printf("average=%f\ncount=%d\n",ave,c); getch(); } | |
测试结果: 说明: 程序中定义了一个外部结构数组boy,共6个元素,并作了初始化赋值。在main函数中用for语句逐个累加各元素的score 成员值存于s之中, 如score的值小于60(不及格)即计数器C加1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。 4建立同学录 #include"stdio.h"
#define NUM 3 struct mem { char name[20]; char phone[11]; }; main() { struct mem man[NUM]; int i; for(i=0;i<NUM;i++) { printf("input name:\n"); gets(man[i].name); printf("input phone:\n"); gets(man[i].phone); } printf("name\t\t\tphone\n\n"); for(i=0;i<NUM;i++) printf("%s\t\t\t%s\n\n",man[i].name,man[i].phone); getch(); } | |
测试结果: 说明: 本程序中定义了一个结构mem,它有两个成员name和phone用来表示姓名和电话号码。在主函数中定义man为具有mem 类型的结构数组。 在for语句中,用gets函数分别输入各个元素中两个成员的值。然后又在for语句中用printf语句输出各元素中两个成员值。 c语言 结构体与共用体学习笔记2 Author:yuexingtian Date: Saturday,june 14,2008 1指向结构变量的指针 用此例来说明:结构指针变量的具体说明和使用方法。 struct stu { int num; char *name; char sex; float score; }boy1={101,"yuexingtian",'M',88.5},*pstu; main() { pstu=&boy1; printf("Number=%d\nName=%s\nSex=%c\nScore=%f\n", boy1.num,boy1.name,boy1.sex,boy1.score); printf("Number=%d\nName=%s\nSex=%c\nSocre=%f\n", (*pstu).num,(*pstu).name,(*pstu).sex,(*pstu).score); printf("Number=%d\nName=%s\nSex=%c\nScore=%f\n", pstu->num,pstu->name,pstu->sex,pstu->score); getch(); } | |
测试结果: 说明: 本例程序定义了一个结构stu,定义了stu类型结构变量boy1并作了初始化赋值,还定义了一个指向stu类型结构的指针变量pstu。在main函数中,pstu被赋予boy1的地址,因此pstu指向boy1。然后在printf语句内用三种形式输出boy1的各个成员值。从运行结果可以看出: 石家庄丽池ceo会所 结构变量.成员名 (*结构指针变量).成员名 结构指针变量->成员名 这三种用于表示结构成员的形式是完全等效的。 2指向结构数组的指针 struct stu { int num; char *name; char sex; float score; }boy[5]={ {101,"yuexingtian",'M',98}, {102,"yuechaotian",'M',99}, {103,"tommy ",'M',100}, {104,"jack chen",'M',88}, {105,"milk liu",'F',66}, }; main() {
struct stu *ps; printf("Number\tName\t\t\t\tSex\tScore\t\n"); for(ps=boy;ps<boy+5;ps++) printf("%d\t%s\t\t\t%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->score); getch(); } | |
测试结果: 说明: 在程序中,定义了stu结构类型的外部数组boy并作了初始化赋值。在main函数内定义ps为指向stu类型的指针。在循环语句for的表达式1中,ps被赋予boy的首地址,然后循环5次,输出boy数组中各成员值。 应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。 ps=&boy[1].sex; 而只能是: ps=boy;(赋予数组首地址) 或者是: ps=&boy[0];(赋予0号元素首地址) 3结构指针变量作函数参数 托克维尔例:计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数编程。 /*用结构指针变量作函数参数编程*/ struct stu { int num; char *name; char sex; float score;}boy[3]={ {101,"yuexingtian",'M',88}, {102,"yuechaotian",'M',98}, {103,"zhanghuimei",'F',45}, }; main() { struct stu *ps; void ave(struct stu *ps); ps=boy; ave(ps); getch(); } void ave(struct stu *ps) { int c=0,i; float ave,s=0; for(i=0;i<3;i++,ps++) { s+=ps->score; if(ps->score<60) c+=1; } printf("s=%f\n",s); ave=s/3; printf("averaga=%f\ncount=%d\n",ave,c); } | |
测试结果: 说明: 山东黄金集团综合办公平台本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps, 并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。 由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。 C语言 结构体与共用体学习笔记3 Author:yuexingtian Date: Tuesday,June 17,2008 动态存储分配 1. 分配内存空间函数malloc 调用形式: (类型说明符*)malloc(size) 功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。 (类型说明符*)表示把返回值强制转换为该类型指针。 “size”是一个无符号数。 例如: pc=(char *)malloc(100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。 | |
2.分配内存空间函数 calloc calloc 也用于分配内存空间。 调用形式: (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。 (类型说明符*)用于强制类型转换。 calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。 例如: ps=(struet stu*)calloc(2,sizeof(struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。 | |
3.释放内存空间函数free 调用形式: free(void*ptr); 功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。 | |
例:分配一个空间,输入一个学生的数据。 main() { struct stu { int num; char *name; char sex; float score; }*ps; ps=(struct stu*)malloc(sizeof(struct stu)); ps->num=15; ps->name="yuexingtian"; ps->sex='M'; 大白鲨光驱ps->score=98.9; printf("Number=%d\nName=%s\nSex=%c\nScore=%f\n", ps->num,ps->name,ps->sex,ps->score); getch(); } | |
|