C语言快速讲解(五)结构体与指针

来源:互联网 发布:软件演示平台 编辑:程序博客网 时间:2024/05/16 12:48

前言:作为一个安卓程序员,如果不懂C/C++开发,那么安卓jni、NDK、视频解码、音频解码也没法开发,有需求我们就要学习,加油吧!今天开始我们快速讲解C语言,有Java基础的人适合看本博客。

----------分割线-----------

需要用的一些头文件:

#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <stdio.h>#include <string.h>#include <Windows.h>
----------分割线--------

1.解释:结构体是一种构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型,看例子:

struct Man{//成员char name[20];int age;};void main(){//初始化结构体的变量//1.struct Man m1 = {"Jack",21};printf("m1的值%s,%d\n",m1.name,m1.age);//2.struct Man m2;//m2.name = "Rose";m2.age = 20;strcpy(m2.name,"Rose");sprintf(m2.name,"K");printf("m2的值%s,%d\n", m2.name, m2.age);//类似JavaScript字面量赋值,只能在变量声明时赋值struct Man m3 = m2;printf("m3的值%s,%d\n", m3.name, m3.age);getchar();}

2.结构体的其他写法:

struct Man{char name[20];int age;} m1, m2 = { "A", 20 };//m1结构体变量名void main(){strcpy(m1.name, "B");m1.age = 11;printf("m1的值%s,%d\n", m1.name, m1.age);printf("m2的值%s,%d\n", m2.name, m2.age);getchar();}
3.匿名结构体(控制结构体变量的个数,相当于java中的单例):
struct{char name[20];int age;}m1;
4.结构体嵌套:
struct Teacher{char name[20];};struct Student{char name[20];int age;struct Teacher t;};void main(){struct Student s1 = { "A", 19, {"TT"} };printf("s1的值%s,%d,%s\n", s1.name, s1.age, s1.t.name);struct Student s2;s2.age = 20;strcpy(s2.name, "ss");strcpy(s2.t.name,"tt");printf("s2的值%s,%d,%s\n", s2.name, s2.age, s2.t.name);getchar();}
5.结构体嵌套2:
struct Student{char name[20];int age;struct Teacher{char name[20];}t;};void main(){struct Student s1 = { "A", 19, { "TT" } };printf("s1的值%s,%d,%s\n", s1.name, s1.age, s1.t.name);struct Student s2;s2.age = 20;strcpy(s2.name, "ss");strcpy(s2.t.name, "tt");printf("s2的值%s,%d,%s\n", s2.name, s2.age, s2.t.name);getchar();}
6.结构体与指针:
struct Man{char name[20];int age;};void main(){struct Man m1 = {"w",20};//结构体指针struct Man *p = &m1;printf("m1地址是%#x\n",p);printf("%s,%d\n", m1.name, m1.age);printf("%s,%d\n", (*p).name, (*p).age);//“->”(箭头)是“(*p).”简写形式printf("%s,%d\n", p->name, p->age);getchar();}

6_2.结构体与指针:

struct Man{char name[20];int age;}M,*MP;void main(){//给结构体的成员变量赋值strcpy(M.name,"A");M.age = 20;//给指针赋值MP = &M;printf("%s,%d\n",MP->name,MP->age);getchar();}

7.指针与结构体数组:
struct Man{char name[20];int age;};void main(){struct Man mans[] = { {"A",1}, {"B",2}, {"C",3} };//遍历结构体数组//1.struct Man *p = mans;for (; p < mans + 2;p++) {printf("%s,%d\n",p->name,p->age);}//2.int i = 0;for (; i < sizeof(mans) / sizeof(struct Man);i++){printf("%s,%d\n", mans[i].name, mans[i].age);}getchar();}
8.结构体的大小:
struct Man{int age;double weight;};void main(){//结构体变量的大小,必须是最宽基本数据类型的整数倍//提升读取的效率struct Man m1 = { 20, 20.4 };printf("地址:%#x\n大小:%d\n",&m1,sizeof(m1));getchar();}
9.结构体与动态内存分配:
struct Man{char *name;int age;};void main(){struct Man *m_p = (struct Man*)malloc(sizeof(struct Man)*20);struct Man *p = m_p;//赋值p->name = "jack";p->age = 20;p++;p -> name = "rose";p->age = 11;struct Man *loop_p = m_p;for (; loop_p < m_p + 2; loop_p++){printf("%s,%d\n",loop_p->name,loop_p->age);}free(m_p);getchar();}
-----------分割线---------

typedef类型取别名。

优点:1.不同的名称代表在干不同的事情typedef int jint

2.不同情况下,使用不同的别名
//#if defined(__cplusplus)
//typedef _JNIEnv JNIEnv;
//typedef _JavaVM JavaVM;

3.书写简单

例子:

struct Man{char name[20];int age;};//Age int类型的别名typedef int Age;//Age int类型指针的别名typedef int* Ap;typedef struct Man JavaBean;typedef struct Man* JM;//结构体取别名//简写typedef struct Woman{char name[20];int age;} W,*WP;//W是Woman结构体的别名,WP是Woman结构体指针的别名//typedef struct Woman W;//typedef struct Woman* WP;void main(){int i = 5;Ap p = &i;printf("i的地址是%#x\n",p);//结构体变量W w1 = {"Rose",20};//结构体指针WP wp1 = &w1;printf("w1的地址:%#x,w1的name值:%s,age的值%d\n",wp1,w1.name,w1.age);printf("w1的地址:%#x,w1的name值:%s,age的值%d\n", wp1, wp1->name, wp1->age);getchar();}
-------------分割线------------

结构体函数指针成员

struct Girl{char *name;int age;//函数指针void(*say)(char*);};//girl结构体类似于Java中的类,name和age类似于属性,say类似于方法void say(char* text){MessageBox(0,text,"title",0);}void main(){struct Girl g1;g1.name = "jack";g1.age = 20;g1.say = say;g1.say("你好");printf("%s,%d\n",g1.name,g1.age);getchar();}
--------完-------



原创粉丝点击