typedef_结构体指针_动态分配_void*

原创 2012年03月29日 18:38:31

#include<stdio.h>
#include<stdlib.h>

typedef struct student{
    int age;
    int sex;
}student1,*p;


void main(){

//typedef用法
    struct student student;
    //student student;  //结构体和结构体变量可以同名
    //student1 student;     //student1 == struct student
    student.age = 10;
    student.sex = 1;
    printf("%d\t%d\n",student.age,student.sex);

//由结构体指针p可实现链表、栈、队列和更加复杂抽象数据类型的实现
    p p_stu;
    p_stu = &student;
    printf("%d\t%d\n",p_stu->age,p_stu->sex);

//动态分配malloc
    const int INIT_SIZE = 10;
    const int INCREATEMENT = 5;
    struct student *p_malloc;
    p_malloc = (struct student*)malloc(INIT_SIZE*sizeof(struct student));
    if(p_malloc == NULL)
        exit(-1);

//realloc动态添加
    for(int i=0;i<20;i++){
    if(i>=INIT_SIZE){
    p_malloc = (struct student*)realloc(p_malloc,(INIT_SIZE+INCREATEMENT)*sizeof(struct student));
    //分配成功判断
  }
  //初始化操作
    scanf("%d%d",p_malloc->age,p_malloc->sex);
}

}

//附:栈和队列的进与出本质为添加与删除

void:无类型   void* :无类型指针
测试1:
float *p1;
int *p2;
p1 = p2;  //反向同理
结果:cannot convert from 'int *' to 'float *'
纠正:p1 = (float*)p2;
结论:在汇编语言中:mov eax,bx是错误的

测试2:
void *p1;
int *p2;
p2 = p1;
结果:错误

测试3:
void *p1;
int *p2;
p1 = p2;
结果:可以通过
结合测试2和测试3得出
结论:“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。

测试4:
void *p1;
int *p2;
int a = 1;
p2 = &a;
p1 = p2;
printf("%d",*p1);
结果:无法通过
小测试:printf("%d",*p1);换成:printf("%d",p1);通过
结论:无类型指针包容其他所有类型指针,但无法指定具体类型,指针本身无类型,为四字节地址

测试5:
函数:test(int a,int b){return a+b},主函数调用test(2,3)会输出5
结论:函数没加返回类型不要总误认为为void类型

测试6:void* 作为子函数参数
#include<stdio.h>
#include<stdlib.h>

typedef struct student{
int age;
int sex;
}student,*p;

student* addstudent(void* stu){
p stu_fun;
stu_fun = (p)stu; //动态绑定  类似于java中Object转型
//测试
printf("stu_fun->age:%d\n",stu_fun->age); //②结果:10
((p)stu)->age = 20; //stu_fun与(p)stu指向同一空间
return stu_fun;
}


void main(){

p stu;
stu = (p)malloc(sizeof(student));
stu->age = 10;
stu->sex = 1;
printf("stu前:stu->age:%d\n",stu->age); //①结果:10

p stu1;
stu1 = addstudent(stu);
printf("stu1->age:%d\n",stu1->age);  //③结果:20
printf("stu后:stu->age:%d\n",stu->age); //④结果:20
}

测试7:void*作为函数返回类型

typedef struct Student
{
int num;
char *name;
}Student, *pStudent;

void * getValue(void * std)
{
pStudent  p = (pStudent)std;
p->name = "hjt";
p->num = 123;
return p;
}

int main(int argnum, char **argstr)
{
pStudent p ;//= (pStudent)malloc(sizeof(Student));
printf("%x\n",&(p->num));

p = (pStudent)getValue(p);

pStudent q = NULL;
q->name = "lasdjf";
q->num = 344;

char *pp;
pp = "alsdjf";

printf("num = %d\n", p->num);
printf("name = %s\n", p->name);

return 0;
}
结论:其他类型指针自动转为void*,故return p有效,变量接收void*函数需要强转
结论2:malloc函数作用不是分配空间,而是赋给结构体变量一个首地址

总结:void真正发挥的作用在于:
  (1)对函数返回的限定;
  (2)对函数参数的限定。

相关文章推荐

void指针强转结构体指针问题

====================================================================================================...

linux c 线程设置detached状态

1. 需要用到的库 pthread_create pthread_attr_init pthread_attr_destory pthread_attr_setdetachstate 各个函数具体...

注意C++中对象指针,慎用void*

        由于不同C++编译器对C++对象模型的结构可能是不一样的。比如说,VC++系列是将虚函数表指针放在对象首地址,而GCC系列的编译器则是将虚函数表指针放在对象地址尾部。        那...

结构体中指针成员的动态分配

示例1:typedef struct _a{ int type; char dat[1]; }A;int main(void) { char* ptr = "hello_wor...

c/c++实现的一个动态分配内存的结构体数组(类似vector)

这个数组可以向里面插入任何类型,包括自定义类型, 程序只是实现了基本功能,还有待完善, 下面是全部代码: #include #include #include #include #includ...
  • ygqwan
  • ygqwan
  • 2013年08月01日 01:37
  • 6365

(语法)理解结构指针和动态分配内存

结构体即我们自定义的数据类型,平时经常用到,结构体指针即将指针加入到一个类型中,理解结构体指针对学习指针可以进一步深入理解,并在链表等格式中运用非常广泛,以下面程序举例分析:...
  • itxxk
  • itxxk
  • 2016年03月22日 10:32
  • 1173

数据结构预备知识之指针,结构体和动态内存的分配与释放

数据结构的整体框架: 数据结构只解决存储问题,算法解决操作问题。算法依附于存储结构,存储不同,算法不同。 衡量算法的标准: 时间复杂度:执行的次数而非时间空间复杂度:占用的内存难易程度健壮性 ...

数据结构与算法入门(2)--预备知识(指针、结构体、动态内存分配)

我们知道程序=数据的存储+数据的操作+计算机程序设计语言。 想要实现典型的数据结构,需要选择一门合适的编程语言。个人认为,C语言是一个很好的工具。C中的指针能很好的实现链表以及以链表为基础的树与图等。...

结构体和共用体sruct union typedef

  • 2009年11月30日 21:29
  • 175KB
  • 下载

文件读写操作+动态内存分配+结构体指针+函数指针数组实现通讯录系统

实现一个通讯录; 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:typedef_结构体指针_动态分配_void*
举报原因:
原因补充:

(最多只允许输入30个字)