c语⾔定义struct类型的数组赋值,typedef和struct
编程题时遇见的,放到这记录并与同类型的⽐较讨论,提⾼⾃⼰编程的思路,以下程序是在win64位 vs2010环境运⾏的
以下是那个编程题
// str dx.cpp : 定义控制台应⽤程序的⼊⼝点。
//
#include"stdafx.h"
#include<stdio.h>
struct S
{int a,b;} data [2]={10,100,20,200};
int main()
{
struct S p=data[1];
printf("%d\n",++(p.a));
}
输出的答案是:21
这个程序它定义了⼀个包含两个int类型的结构体S:
struct S
{int a,b;}
然后⼜定义了⼀个结构体S类型的数组data[2]:
struct S
{int a,b;} data [2]={10,100,20,200};
要求输出输出data[1]对应的结构体S的区域中对应的int a的值:
struct S p=data[1];
p.a=data[1].a;p.b=data[1].b;
printf("%d\n",++(p.a));
在这个程序中,赋值的部分处于数组data[2]的那⼀句data [2]={10,100,20,200};
在这⾥声明 data 是 结构 S 数组。初始化 data[0].a=10; data[0].b=100;data[1].a=20;data[1].b=200;
**这⾥的写法虽然可读性差了些但是,代码量更少
(实际上程序利⽤了通过数组开辟的内存空间对数据进⾏了直接的存储,⽽⽆需使⽤malloc函数为其对应的变量分配存储空间,在⼀些如需要数据存储的项⽬中都有着类似的使⽤⽅法,当然那些⽅法可能会联系上链表等更复杂的数据结构写法⼀起与程序使⽤),**
为了更直观的了解使⽤数组在这⾥节省的代码量的程度,以及数组与使⽤结构体指针之间的关系,写出⼏种使⽤结构体的⽅式供⼤家理解.
.⾸先我们定义⼀个新的结构体来看看
struct S
{
int a,b;
char*d;
}*data0,*data1,SS;
第⼀种
最简单的写法呢,就是在main函数中直接定义⼀个S类型的变量并赋值,如下(输出为字符串000)
注意:这个输出字符串也是为什么在定义struct S时定义了⼀个char* 类型的指针d的原因, 即 :指针d指向我们要保存的字符串"000"储存空间的⾸地址,(很像数组不是吗,被看这篇⽂章指针绕晕的⼩⽼弟可以看看我的另⼀篇博客,c++通过结构体(struct)全局变量在多线程中传递参数,⾥⾯我画的理解指针传递参数的图,多绕⼀下加深理解(⼿动滑稽))
struct S dd;
dd.d ="000";
printf("dd.b: %s\n",dd.d);
第⼆种
通过定义结构体S时的末尾写上的指针变量的⽅式进⾏,赋值,以下的的两个指针data0和data1都是在定义结构体S时的末尾写上的,
注意以下sizeof函数中统计S类型的两种不同的写法.第⼀种直接写struct S(推荐),第⼆种则写指向struct S类型空间⾸地址的指针data1 malloc函数的返回值是⼀个指向所分配内存起始地址的指针,类型为void 型,所以在之前要加上(struct S)的强制类型转换.
(温馨提⽰上⾯两个函数使⽤时记得加上与其对应的头⽂件)
data0 =(struct S*)malloc(sizeof(struct S));
data0->b =111;
printf("data0: %d\n",data0->b);
data1 =(struct S*)malloc(sizeof(data1));
data1->b =222;
printf("data1: %d \n",data1->b);
第三种
在main函数使⽤时,定义指针进⾏赋值,这个和上⾯倒是没多⼤差别,不过关系到typedef使⽤就另外拿出来说⼀下
没⽤typedef的情况
printf("begin \n");//没有typedef
struct S *data3;
//printf("1\n");
data3 =(struct S*)malloc(sizeof(struct S));
//printf("2\n");
data3->b =333;
//printf("3\n");
printf("data :%d\n",data3->b);
⽽使⽤typedef的话
当然⾸先我们先把struct使⽤前对它进⾏typedef的使⽤变成
typedef struct S1
{int a,b;}*da;
然后和类似但不完全类似的进⾏赋值(注意理解sizeof中的da和data5,它们在这⾥都指向struct S类型所占的内存空间的⾸地址,)
da data4;//有typedef
data4 =(struct S1*)malloc(sizeof(da));
data4 ->b =444;
printf("data4: %d\n",data4->b);
da data5;//有typedef
data5 =(struct S1*)malloc(sizeof(data5));
data5 ->b =555;
printf("data5: %d\n",data5->b);
然后你会发现typedef貌似就是把struct S换了个名字,⽐如这⾥就换成了da,
这⾥就需要⽐较⼀下了,da声明的时候是
typedef struct S1
{
int a,b;
char*d;
}*da;
⽽与之相同data0和data1在没有typedef时是
struct S
{
int a,b;
char*d;
}*data0,*data1,SS;
这⾥你可以⽤da来声明⼀个struct S指针类型的指针data4和data5.(具体代码在从这⾥数上⾯第3个⿊框⾥)
但不能⽤data0或者data1来定义struct S指针类型的指针data3.
当然你可以定义⼀个struct S类型的data3后让它等于data0或者data1,如下(当然在本程序中纯属吃饱了撑得慌) printf("begin \n");//没有typedef
struct S *data3;
data3 = data0;
data3 =(struct S*)malloc(sizeof(struct S));
data3->b =333;
printf("data :%d\n",data3->b);
以下是完整代码:
// str dx.cpp : 定义控制台应⽤程序的⼊⼝点。
//
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
struct S
{
//int c;
//char e[10];
int a,b;
char*d;
}*data0,*data1,SS;
typedef struct S1
{int a,b;
char*d;
}*da;
/
/typedef struct S {
/// int a;
// int b ;
//}*LNode;
//data [2]={10,100,20,200};
// 定义结构 S, 它含2 个整型成员。
// 声明 data 是结构 S 数组。初始化 data[0].a=10; data[0].b=100;data[1].a=20;data[1].b=200;
int main()
{
struct S dd;
dd.d ="000";
printf("dd.b: %s\n",dd.d);
//printf("初始化值:%s\n",dd.e);
data0 =(struct S*)malloc(sizeof(struct S)); data0->b =111;
printf("data0: %d\n",data0->b);
data1 =(struct S*)malloc(sizeof(data1)); data1->b =222;
printf("data1: %d \n",data1->b);
printf("begin \n");//没有typedef
struct S *data3;
data3 = data0;
//printf("1\n");
data3 =(struct S*)malloc(sizeof(struct S)); //printf("2\n");
molloc函数
data3->b =333;
//printf("3\n");
printf("data :%d\n",data3->b);
da data4;//有typedef
data4 =(struct S1*)malloc(sizeof(da));
data4 ->b =444;
printf("data4: %d\n",data4->b);
da data5;//有typedef
data5 =(struct S1*)malloc(sizeof(data5)); data5 ->b =555;
printf("data5: %d\n",data5->b);
printf("begin2 \n");
/
/data0->b = 100;
//printf("%d",data0->b);
//struct S data = {20,200};
//data1 = &data;
//printf("data1->b: %d",data1->b);
}
运⾏结果⽰意图:
程序下载(不⽤积分的说):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。