1、结构体前面加不加typedef有什么区别?
typedef struct BiTNode{
char data;
struct BiTree *lchild, *rchild;
int numl,numr;
}BiTNode,*BiTree;
结构体名没有加typedef的话,以后每次定义变量都必须是这样的:
struct BiTNode * p ;
struct BiTree root = (struct BiTree)malloc(sizeof(struct BiTNode));
而如果加了typedef,那么之后的定义新变量课直接用结构名定义:
BiTree *p;
BiTree p = (BiTree)malloc(sizeof(BiTNode));
好处就是代码更加简洁且直观。
补充:
我发现typedef 好像没那么简单。
struct studentInfo{
char name[10];
char number[10];
int score;
}stu[100];
首先来看下上面这个代码:是一个结构体数组,这里的stu[100] 是指该结构体的变量,之后我们可以直接给这个变量赋值。那假如加上typedef 呢?
typedef struct studentInfo{
char name[10];
char number[10];
int score;
}stu[100];
加上typedef 会报错。因为这里的stu[100]默认为studentInfo 取了一个别名,但stu[100] 和studentInfo 类型不同,肯定会报错。那我们重新定义一个变量
stu s;//这里的s就是一个大小为100 的结构体数组。
2、指针作为函数参数的传递
2.1值传递
#include <stdio.h>
void swap1(int x,int y){
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a=1,b=2;
swap1(a,b); printf("s1:a=%d,b=%d\n",a,b);
return 0;
}
2.2地址传递
1
void swap2(int *px,int *py){
int t;
t=*px;
*px=*py;
*py=t;
}
int main()
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap2(pa,pb);
printf("s2:a=%d,b=%d\n",a,b);
return 0;
}
2、本质上还是值传递,指针变量本质上也是一个无符号类型变量。(看我画的图可以明白其过程)
void swap3(int *px,int *py){
int *t;
t=px;
px=py;
py=t;
}
int main()
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap3(pa,pb);
printf("s3:a=%d,b=%d\n",a,b);
return 0;
}
上面三种情况的结果如下:
2.3二级指针的传递
#include <stdio.h>
void swap(int **x, int **y)
{
int t;
t = **x;
**x = **y;
**y = t;
}
int main()
{
int a = 10, b = 20;
int *pa = &a;
int *pb = &b;
swap(&pa, &pb);
printf("a = %d\nb = %d", a, b);
return 0;
}
先上结果:
要是以后再混乱,就回来翻一翻。