typedef struct Node{...}LNode;
以上定义中,是不是可以去掉第一个Node?然后依然可以得到新类型LNode
typedef struct Node* Linklist;
以上定义中,既然已经自定义了LNode类型,为什么不这样写:typedef LNode* Linklist;
而还要用 struct Node呢?
struct //是C中的结构体的关键词。
如: stuct node{
/* node 相当于结构体的类型,关键是!
其实在C中stuct node 才相当于一个数据类型,如int ,所以在才会给初学者的带来困难,如在定一个变量时,要用 struct node xxx,而不是 node xxx 这就是关键。
*/
int a;
.....
} a; //
a是结构体的变量
而 typedef // 是自定义数据类型。
如:typedef int zengshu // 把一个数据类型用一个直观的数据类型名代替,增加程序的可移植性。
而且 typedef struct node {
}A;
则是把 struct node 看做一个数据类型(见关键处),不同的是这个结构体类型的定义也放在后面。 而A则是那个直观的数据类型名,引用的时候更加方便。
第一个问题:可以,如果去掉typedef 就可以
第二个问题:可以这样写. 我测试的代码:可以通过
#include
#include
typedef struct
{
int a;
float b;
}aaa;
typedef aaa* bb;
int _tmain(int argc, _TCHAR* argv[])
{
bb c=(bb)malloc(sizeof(aaa));
c->a =4;
printf("%d\n",c->a);
free(c);
return 0;
}
而且可以直接typedef struct Node{...}LNode,* Linklist ; 然后Linklist就是指针结构了.
typedef已经将 struct Node{...} 定义为了 LNode,因此可以直接用LNode* Linklist 定义结构体指针,相当于 struct Node * Linklist
#include "malloc.h "
#include "stdio.h"
这2个没显示出来,可能是csdn过滤了尖角号,换成""也可以
struct Node{
int a[10];
int length;
}
int main(){
Node* a;
initNode(a);
return 0;
}
错误方法:
void initNode(Node *a){
a = (Node*)malloc(sizeof(Node));
a->lenght=0;
}
它不会改变main函数中的a原因是main中传入的是地址给initNode方法中的a而a第一句是重新申请个地址,所以它的地址不是原来的。它已经脱离了main中a它的改变对main中那个变量没有一点影响
正确的方法:
void initNode(Node* &a){
a = (Node*)malloc(sizeof(Node));
a->lenght=0;
}
它的含义就是把main中那个指针变量等价与initNode中的这个指针变量。它们为同一个指针。为什么了,我想是它传入的是存储指针的地址而不是指针指向地址。为了理解就认为它就把自己传入。
另外有个误区对与数组int a[10];我们不能这样
void initArray(int a[]){
a = {1,2,3,4,5,6,7};
}
a在是数组的首地址,它是个常量你这要做的意思是把a的地址又改变了,常量怎么可以改变了。。。。就如1不能为2
typedef struct Node{...}LNode;
以上定义中,是不是可以去掉第一个Node?然后依然可以得到新类型LNode
这个Node是可以去掉的,前提是你在结构体内部不使用struct Node类型定义其他变量。
typedef struct Node* Linklist;
以上定义中,既然已经自定义了LNode类型,为什么不这样写:typedef LNode* Linklist;
而还要用 struct Node呢?
可以写成typedef LNode* Linklist;
测试代码如下
int main()
{
typedef struct
{
int a;
}LNode;
LNode b;
typedef LNode* link;
link c = &b;
c->a = 10;
printf("%d \n",c->a);
}