一个由C/C++编译的程序占用的内存分为以下几个部分:
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。
1、指向结构体变量的指针
指向结构体变量的指针,既可以指向结构体变量,也可以指向结构体数组中的元素。
如:Struct Student * pt;
如果p指向一个结构体变量stu,以下3种用法等价:
(1)sth.成员名(如:stu.num);
(2)(* p).成员名(如:(*p).num);
(3)p->成员名(如:p->num)。
成员运算符“.”的优先级高于“*”,所以()不能省去。
2、指向结构体数组的指针
如果定义p 是指向struct Student 类型对象的指针变量,
struct Student{
int num;
char name[20];
};
struct Student stu[3];
struct Student * p;
p=stu;
它用来指向一个struct Student 类型的对象(结构体数组中的一个元素stu[0]的起始地址),不应用来指向stu数组元素中的某一成员。否则,编译时将产生警告,提示地址的类型不匹配。
如果要将某一成员的地址赋值给p ,可以用强制类型转换。如下:
p=(struct Student *)stu[0].name
此时,p 的值是stu[0]元素的name成员的起始地址。可以用printf("%s",p);输出stu[0]中成员name的值。之后执行printf("%s",p+1);时,输出的是stu[1]中name的值。
3、用结构体变量和结构体变量的指针作函数的参数
将一个结构体变量的值传递给另一个函数,有3个方法:
(1)用结构体变量的成员作参数。如:stu[0].num,属于单向值传递。
(2)用结构体变量作实参。也是单向值传递,此种方式是将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销很大。
(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传递给形参。这种方法是比较合理的。