C语言基础学习之结构体与指针实例
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include
//结构体是一种构造数据类型 //把不同的数据类型整合起来成为一种自定义的数据类型 /*struct Man { char* name; int age; }; void main(){ //1.构造方式赋值 struct Man m1 = { "jack", 20 }; //2.赋值 struct Man m2; m2.age = 30; m2.name = "tom"; printf("%s,%d\n", m2.name, m2.age); getchar(); }*/
//结构体的几种写法 /*struct Man { char name[20]; int age; } m1, m2 = { "jack", 20 }; void main(){ //对于char数组的赋值要使用strcpy函数,这个函数是string.h中的 strcpy(m1.name, "tom"); m1.age = 30; printf("%s,%d \n", m1.name, m2.age); getchar(); }*/
//匿名结构体 /*struct { char* name; int age; } m1; void main(){ m1.age = 30; m1.name = "tom"; printf("%s,%d\n", m1.name, m1.age); getchar(); }*/
//结构体嵌套 /*struct Teacher{ char* name; }; struct Student{ char* name; int age; //内部嵌套Teacher结构体 struct Teacher t; }; void main(){ //赋值 struct Student s1 = { "tom", 20, { "jack" } }; //依次输出学生的姓名,年龄,老师姓名 printf("%s,%d,%s\n", s1.name, s1.age, s1.t.name); getchar(); }*/
//结构体嵌套2 /*struct Student{ char* name; int age; struct Teacher{ char *name; } t; }; void main(){ //依次赋值 struct Student s1 = { "tom", 20,"rose"}; //依次输出学生的姓名,年龄,老师姓名 printf("%s,%d,%s\n", s1.name, s1.age,s1.t.name); getchar(); }*/
//结构体和指针 /*struct Student{ char* name; int age; }; void main(){ struct Student s1 = { "tom", 16 }; struct Student* p = &s1; //这三种表示方法相同 printf("%s,%d \n", s1.name, s1.age); printf("%s,%d \n",(*p).name,(*p).age); //“->”(箭头)是“(*p).”简写形式 printf("%s,%d \n",p->name,p->age); getchar(); }*/ //指针数组及其遍历 /*struct Student{ char* name; int age; }; void main(){ //结构体数组 struct Student stArr[] = { { "tom", 20 },{"rose",16} }; //遍历 struct Student* p=&stArr; //第一种遍历 for (; p < stArr+2; p++) { printf("%#x\n",p); printf("%s,%d\n",(*p).name,(*p).age); printf("%s,%d\n", p->name, p->age); } //第二种遍历 int i = 0; for (; i //结构体的大小(字节大小) /*struct Man{ int age; double weight; }; void main(){ struct Man m1 = { 20, 89.0 }; //结构体变量的大小,必须是最宽基本数据类型的整数倍 //提升读取的效率 printf("%#x,%d",&m1,sizeof(m1)); getchar(); }*///结构体和动态内存分配 /*struct Man{ char* name; int age; }; void main(){ //动态分配10个man结构体大小 struct Man* m_p=(struct Man*)malloc(sizeof(struct Man) * 10); struct Man* p = m_p; p->name = "rose"; p->age = 16; p++; p->name = "jack"; p->age = 20; //遍历数组 struct Man* loop_mam = m_p; for (; loop_mam < m_p + 2; loop_mam++){ printf("%s,%d \n", loop_mam->name, loop_mam->age); } //释放指针 free(m_p); getchar(); }*///typedef 类型取别名 //1.不同名称代表在干不同的事情typedef int jint; //2.不同情况下,使用不同的别名 //#if defined(__cplusplus) //typedef _JNIEnv JNIEnv; //typedef _JavaVM JavaVM; //3.书写简洁 //给类型取别名 //Age是int的别名 /*typedef int Age; //Ap是int类型指针的别名 typedef int* Ap; struct Man{ char* name; int age; }; //给结构体取别名 //可以很方便的辨别 typedef struct Man JavaMan; typedef struct Man* JM; //简写 //W是给WoMan结构体取的别名 //*WM是WoMan结构体指针的别名 typedef struct WoMan{ char* name; int age; } W,*WM; void main(){ //结构体变量 W w1 = { "tom", 16 }; //结构体指针变量 WM wm = &w1; printf("%s,%d\n", w1.name, w1.age); printf("%s,%d\n", wm->name, wm->age); getchar(); }*///结构体函数指针成员 /*struct Girl{ char* name; int age; //函数指针 void(*say)(char*); }; //Girl结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法 void sayHi(char* c){ MessageBox(0, c, "title", 0); } void main(){ struct Girl girl; girl.name = "rose"; girl.age = 16; girl.say = sayHi; girl.say("hello world"); getchar(); }*/typedef struct Girl{ char* name; int age; //函数指针 void(*say)(char*); } Girl; //Girl结构体指针取别名GirlP typedef Girl* GirlP; void sayHi(char* text){ MessageBox(0, text, "title", 0); } void rename(GirlP gp1){ gp1->name = "Lily"; } void main(){ //赋值 Girl g1 = { "Lucy", 18, sayHi }; //指针 GirlP gp1 = &g1; //调用方法 gp1->say("Byebye!"); //传递指针,改名 //rename(&g1); 这个老是错误 getchar(); }