title: 指针的部分总结(下)
四、指针的使用
5.结构体指针
(1)定义结构的一般形式为:
struct 结构名{
成员列表
};
(2)使用指针来指向结构的解释说明:
struct guy{
char favfood;
char job;
float income;
}
struct guy fellow[2];/*这是一个结构数组*/
struct guy * him/*声明一个指向结构的指针*/
him=fellow[0]/*告诉指针它指向的地址*/
声明指针的语法和其他的指针声明一样,意味着指针him可以指向任何现有的guy类型的结构。而令指针指向fellow[0]则是对该指针的初始化。
同样的,如果对him加1,那么指针指向的地址就加了1+1+4=6个字节,因为每个结构体占的内存空间为6。
(3)使用指针来访问结构体的成员时有两种方法:
①结构指针后跟->运算符,而需要注意的是结构名之后则需跟.(点)运算符,即:
him->job is fellow[0].j0b if him == fellow[0]
②利用&和* 的互逆性,因为him=&fellow[0],则有*him=fellow[0]
(4)使用指针传递结构成员
#include <stdio.h>
double people(const struct guy *)//people函数使用了指针作为参数
int main()
{
printf("%.2f",people(&him));//把地址&him传给该函数使得指针指向结构him
return 0;
}
double people(const struct guy * anyone)//确定指针为anyone
{
return anyone->job;
}
需要注意的是,数组可以通过使用其数组名作为数组地址,但是结构不可以使用结构名作为其地址必须使用&运算符
(5)结构指针与malloc
当我们在结构中使用指针来存储字符串时,例如:
struct pnames {
char * first;
char * last;
}
与常用的字符数组不同的是是现在字符串存储于编译器存储字符的任意位置,不局限于结构内部,这个结构中存放的只有8字节的地址信息。
但是需要注意的是,pnames结构并不会为字符串分配空间,为了避免出错,first,last所指向的字符串一定是在程序其他地方已经分配过空间,这里我们经常用的方法是使用malloc()分配内存。
pnames->first=(char*)malloc(sizeof(char))//成员指针被分配内存
free(pnames->first)//不要忘记free掉不用的内存