c_04 结构体—important

来源:互联网 发布:免费的数据恢复工具 编辑:程序博客网 时间:2024/06/08 09:39
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
//结构体是一种构造数据类型
//把不同的数据类型结合起来成为  : 一个自定义的数据类型
/*
struct Man{
//成员
char name[20];  //a
//char* name;     //b
int age;          
//int(*func)();
};
void main(){


//初始化结构体类型的变量
//方式一:
  // struct Man  person = { "charles", 27 };


//方式二:
struct Man person;
person.age = 27;
//person.name = "charles";  //b  指针字符串才可以  成员 char* name;
  //strcpy(person.name, "charles"); //a 
sprintf(person.name,"jack");
printf("%s,%d\n",person.name,person.age);
getchar();
}
*/


//结构体的几种写法
/*
struct Men{
char name[20];
int age;

} m1, m2 = {"Rose",18};//m1 结构体变量名


void main(){

strcpy(m1.name,"jack");
m1.age = 20;

printf("%s,%d\n",m1.name,m1.age);
printf("%s,%d\n", m2.name, m2.age);
getchar();
}
*/




//匿名结构体
//主要用于控制结构体变量的个数(限量版只能通过m1来使用该结构体)
/*
struct {
char name[20];
int age;


} m1;
*/


//结构体嵌套
/*
struct Teacher{
char name[20];
};
struct Student{
char name[20];
int age;
struct Teacher t;
};


void main(){
struct Student s1 = { "Jason", 23, { "Vivi" } };
struct Student s2;
s2.age = 10;
strcpy(s2.name, "Jason");
strcpy(s2.t.name,"Vivi");  //链式命名

system("pause");


}
*/


/*
struct Student{
char name[20];
int age;
struct Teacher{    //内部匿名结构体
char name[20];
} t;
};


void main(){
struct Student s1;
strcpy(s1.t.name,"Tom");
}
*/


/*
//结构体与指针
struct Man{
char name[20];
int age;
};
void main(){


struct Man m1 = {"Jack",30};
//结构体指针
struct Man *p = &m1;


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

}
*/


/*
//结构体数组与指针
struct Man{
char name[20];
int age;
};
void main(){


struct Man mans[] = { { "Jack", 20 }, {"Rose",22} };
//结构体指针
struct Man *p = mans;
//指针遍历
for (; p < mans + sizeof(mans)/sizeof(struct Man);p++){
printf("%s,%d\n", p->name, p->age);
}
//下标遍历
int i = 0;
for (; i < sizeof(mans) / sizeof(struct Man);i++){
printf("%s,%d\n", mans[i].name, mans[i].age);
}
getchar();
}*/


//结构体的大小 (字节对齐)
/*
struct Man{
int age;   //4字节  -->对象中占8个字节  和最大的那个属性类型的字节长度对齐
double weight;  //8字节   


};
void main(){
//结构体变量的大小,必须是最宽基本数据类型的整数倍  eg:本例中必须是double的整数倍 12--》16
//浪费空间 换取读取的时间 提高了读取效率---》 固定长度
struct Man mm = { 22, 68.5 };
printf("%#x,%d\n",&mm,sizeof(mm));  //0xd3f790,16


getchar();


}
*/


/*
struct Man{
char *name;
int age;
};


//结构体动态内存分配
void main(){
struct Man *m_p = (struct Man*) malloc(sizeof(struct Man)*5);  //动态内存分配5个sturct Man类型的大小
struct Man *p = m_p;
//赋值
p->age = 22;
p->name = "Jack";
p++;
p->age = 25;
p->name = "Rose";

struct Man *loop_p = m_p;
for (; loop_p < m_p + 2;loop_p++){
printf("%d,%s\n", loop_p->age,loop_p->name);

}
free(m_p);  //释放内存
getchar();
}
*/


typedef: 简单的说,就是按照定义变量的方式,把变量名换成新类型名,

并且在最前面加上"typedef",就声明了行类型名代表原来的类型.

eg:

以定义数组类型为例来说明:

1.先按照定义数组变量形式书写: int a[20];

2.将变量名称改为自己命名的类型名 int  Num[20];

3.在前面加上"typedef"得到 typedef int Num[20];

4.用自定义类型名来定义变量  Num  a  -->相当于定义了  int a[20];

eg:

void showMsg(char*msg, char*title){
MessageBox(0,msg,title,0);
}
typedef void(*Jfun)(char*m, char*n);  //函数指针用别名取代  使用起来简单易懂  类似java类
void main(){
//double f = 2.5;
//double *int_poniter = &f;
//printf("%lf",*int_poniter);

//原生
//void(*fun_p)(char*m, char*n) = showMsg;
//fun_p("how are you !","say Hi");

//用别名
Jfun fun = showMsg;
fun("how are you !", "say Hi");

getchar();
}


//小知识点:

字符数组赋值只能在声明时, //字符指针可以更改赋值,但是不能更改某个元素

char a[20];  a="hello"; //无法日通过编译 

 char  a[20] = "hello";//声明时赋值

  a="Morning"//这是无法通过编译的

a[0] = ’H‘;//可以更改某个元素

//想要重新赋值  只能通过一些字符串函数实现:strcpy(a,   "Morning");


/*
//typedef 类型取别名
//1.不同的名称代表在做不同的事 typedef int jint
//2.不同的情况下使用不同的别名  typedef _JNIEnv JNIEnv;t ypedef _JavaVM JavaVM;
//3.书写简洁
//常见类型取别名
typedef int* Ap;
typedef int Age;
//-----------------
struct Man{
char *name;
int age;
};
//结构体取别名 的两种方式
//方式一:根据需要想取别名时才去定义
typedef struct Man  JavaMan;
typedef struct Man  *JM;
//方式二:定义结构体的时候直接取别名
typedef struct Woman{
char* name;
int age;

} W,*Wp;


void main(){
Age i = 20;
Ap t = &i;
printf("%d\n",i);
printf("%d\n",*t);

//==================
W w = { "charles", 23 };
Wp wp = &w;
printf("%d,%s\n",wp->age,wp->name);
getchar();
}
*/


//结构体函数指针成员
typedef struct Girl {
char *name;
int age;
//函数指针
void(*sayHi)(char*);
} JGirl;
//Girl 结构体类似于Java中的类,name age 类似属性 ,sayHi类似于方法
//Girl 结构体指针取别名
typedef struct Girl* Girlp;
void sayHello(char* str){
MessageBox(0, str, "Say Hi :", 0);
}
//Girlp == Girl*
void reName(Girlp glp){
glp->name = "Jhon";
}
void main(){
//原生创建结构体对象
struct Girl girl = {
"Lily", 22, sayHello
};
//用别名创建结构体对象
JGirl jgirl = {
"Lily", 22, sayHello
};
//原生创建结构体指针
struct Girl* girl =  &girl;

//用结构体指针别名创建结构体指针
Girlp gp = &jgirl;

//传递指针,给结构体对象改名
reName(gp);
printf("%s\n",gp->name);

gp->sayHi("你好啊!");
//girl.sayHi("how are you !");


getchar();
}
原创粉丝点击