编程题时遇见的,放到这记录并与同类型的比较讨论,提高自己编程的思路,以下程序是在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");
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);
}
运行结果示意图: