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();
}