您的位置:首页 > 理论基础 > 数据结构算法

C语言中结构体与指针的若干问题(在数据结构中的应用)

2015-09-24 18:59 330 查看
【 注】:

在讲下面的东西之前,先讲几个易错的东西,

1.sizeof 这个东西看起来像是函数,其实不是就是一个运算符,求字节的。

int a = sizeof(int);

这里就求出来了int型占用的是4个字节(这里依据个人电脑版本不同会有出入,我的是win7 64位)。





2. define 这个就是给一个东西起一个新的名字例如

#define MAXN 100

那么以后在使用MAXN这个的时候它代表的就不是字符串了,而是100.



也可以用来定义函数



#define max(x, y) x > y ? x : y



3.typedef

这个其实和上一个很像。这个东西在学习数据结构的时候经常出现,

例如当大家第一次看到



ElemType SqList()

{

...

...

}



的时候会觉得这ElemType是什么类型,都没看过.

这时大家就可以在书的最前面找到

typedef int ElemType;

这里代表的就是给 int 起一个别名,叫做ElemType.

在数据结构中这么做是为了调Bug的时候很方便。好了基础的铺垫就讲这么多。

一、首先什么是结构体:

大家都知道数据类型吧,int 整形, char 字符型, float 单精度 , double 双精度, 等等都是C语言等其他高级语言自带的数据类型。





数组就是用户自己定义的数据类型,结构体 struct 也是用户自己定义的数据类型。



Example:

int a[MAXN]; //MAXN 之前定义为10

那么这个a数组可以存储10个整形的元素



char b[MAXN];

那么这个b数组可以存储10个字符型的元素



那么如果我想在一个数组里存储不同类型的元素怎么办。

这里就设计了一个好的数据类型---->struct 结构体。

结构体可以把系统已经有的不同的数据类型或用户定义的结构型。



Example

typedef struct

{

int a;

char c;

float c;

}TypeA;



这是一个新的数据类型,TypeA型。



具体调用可以这样使用:



TypeA.a = 10;

TypeA.b = 'a';

TypeA.c = 1.8;

...

...

...





还可以用这个定义数组

TypeA m[3];

这时每个数组的元素都有了三个属性。

m[0].a = 20;

m[0].b = 's';

m[0].c = 4.5;

...

...

...



以上就是结构体的使用,各位小伙伴懂了吗?





二、接下来是指针

指针和结构体一样,都是数据类型,只不过指针型变量内部装的是变量的地址。

共过它可以找出这个变量在内存中的位置,就像一个指示方向的指针,指出了某个变量的位置,

因此叫做指针型。





定义规则:

int *a; //指向整形变量的指针

char *b; //指向字符型变量的指针

float *c; //指向浮点型变量的指针

TypeA *d; //指向TypeA型变量的指针

...

...

...



这里可以对比一下直接定义int等....

如果a是个指针型变量,且它已经指向一个变量b,则a中存放的变量b所在的地址。

*a就是取变量b的内容(X = *a; 等价于x = b;)

&b就是取变量b的地址。

a = &b;就是把变量b的地址放在变量a中。







三、结构体与指针的混用

如链表的定义:

typedef struct Node

{

int data; //这里默认的是int型,如需要其他类型可直接修改

struct Node *next; //指向Node型变量的指针

}Node;





二叉树的定义:

tyedef struct BTNode

{

int data;

struct BTNode *lchild;

struct BTNode *rchild;

}BTNode;



还可以

tyedef struct BTNode

{

int data;

struct BTNode *lchild;

struct BTNode *rchild;

}BTNode, *btnode;



这里多了一个*btnode.

在定义一个结点指针p的时候,

BTNode *p; 与 btnode p;等价







这里的使用还不同。



BTNode.data = 10;



(*BTNode)->data = 10;



大家看出区别没,

如果前面BTNode定义的是普通的变量调用就是” . “

如果是指针类型的就是->.



基本就是这些不太容易懂得,也欢迎各位补充。

大家懂了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: