C语言指针结构的应用实例,C语言基础学习之结构体与指针实例

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值