老忘的东西,说明自己还是掌握的不熟练,记录一下。
typedef struct student
{ //数据域
int num; //学号
int score; //分数
char name[20];
}STU;
1.何时分配内存
根本就是你想给他的成员赋值,
例1:
(1)我给他的学号赋值,首先定义一个变量,STU stu;//同时已经分配好内存了。
(2) 给学号赋值 ,scanf("%d ",&stu.num);
例2:
(1)同样想给他的学号赋值,STU *new = NULL;//只开辟了存放new地址的内存,地址大小就是sizeof(new)。而不是整个结构体的。/*就相当于你去朋友家,你的朋友给了你一张写着门牌号的纸,这张纸就是指针的内存空间*/
(2)下面想要给学号赋值必须先给结构体分配内存,new=(STU*)malloc(sizeof(STU));/*相当于你朋友家房子的大小,房子里有你朋友,家具等等,上面说的纸上放着门牌号,但是不可能将你朋友和家具放在纸上,房子相当于结构体的内存空间*/
(3)给学号赋值,scanf("%d ",&new->num);
2.结构体当做参数
下面先给大家看两个例子
例1:
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
int num;
char name[20];
}STU;
void InitStu(STU **new)
{
(*new) = (STU *)malloc(sizeof(STU));/*此时(*new)就相当于main函数的stu,因为操作的地址一样*/
(*new)->num = 66;
//printf("--%p\n", *new);
}
int main()
{
STU *stu = NULL;
InitStu(&stu);
// printf("--%p\n", stu);
printf("%d\n", stu->num);
free(stu);
return 0;
}
运行结果无误。
再看个例2:
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
int num;
char name[20];
}STU;
void InitStu(STU *new)
{
printf("--%p", new);/*还是main函数中stu的地址*/
new = (STU*)malloc(sizeof(STU));/*new 重新指向了堆中的地址*/
new->num = 66;/*给堆中的结构体成语赋值*/
}
int main()
{
STU stu;/*已经开辟了内存*/
InitStu(&stu);/*传进去的是stu的地址,但是没有意义*/
printf("%d\n", stu.num);
return 0;
}
运行结果不能确定。 why? 例2中很明显,定义了stu 变量,把stu的地址传进了InitStu函数。但是执行malloc的时候new的地址不是main函数中的stu的地址了,是在堆中开辟的地址。
总结:现在看来也没什么难点嘛,对付指针这种特殊的变量,就明白他两个功能好了
1.函数间的地址传递
2.用传址的方式改变实参内容,或者访问其数据成员。