指针也可以指向一个结构体变量定义的一般形式为:
struct 结构体名 * 变量名;
前面已经定义了一个结构体 stu:
- struct stu{
- char*name;
- intnum;
- charsex;
- floatscore;
- };
小编推荐一个学 C 语言 / C++ 的学习裙 二六三, 六八八, 二七六 , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
下面定义一个指向 stu 的指针变量 pstu:
struct stu *pstu;
当然在定义结构体的同时也可以定义 pstu:
- struct stu{
- char*name;
- intnum;
- charsex;
- floatscore;
- }*pstu,stu1,stu2;
pstu 可以指向结构体变量:
- pstu = &stu1;
- pstu = &stu2;
应该把结构体变量的首地址赋给 pstu, 而不能把结构体名赋给 pstu, 而且结构体变量前面要加取地址符 & 下面的写法都是错误的:
- pstu = &stu;
- pstu = stu1;
结构体名和结构体变量是两个不同的概念, 不能混淆结构体名只能表示一个结构形式, 是一种数据类型, 编译器并不对它分配内存空间, 就像 intfloat 这些关键字本身不分配内存一样只有当一个变量被定义为这种数据类型时, 才对该变量分配内存空间所以上面 &stu 这种写法是错误的, 不可能去取一个结构体名的首地址
另外, 不要认为结构体和数组类似, 数组名表示数组的首地址, 而结构体变量不表示首地址, 它表示的是结构体本身这块内存空间的整体就像 int a;,a 不是首地址, 而是表示它本身
有了结构体指针, 就可以获取结构体成员了, 一般形式为:
(* 结构指针变量). 成员名
或者:
结构指针变量 ->成员名
例如:
(*pstu).num
或者:
pstu->num
注意 (*pstu) 两侧的括号不可少, 因为成员符. 的优先级高于 * 如去掉括号写作 * pstu.num, 那么等效于 *(pstu.num), 这样意义就完全不对了
小编推荐一个学 C 语言 / C++ 的学习裙 二六三, 六八八, 二七六 , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
示例结构体指针变量的使用
- #include
- struct stu{
- char*name;
- intnum;
- charsex;
- floatscore;
- }*pstu,stu1={"He fang",1,'F',92.5};
- intmain(){
- pstu=&stu1;
- printf("Number=%d, Name=%s\n",stu1.num,stu1.name);
- printf("Sex=%c, Score=%f\n\n",stu1.sex,stu1.score);
- printf("Number=%d, Name=%s\n",(*pstu).num,(*pstu).name);
- printf("Sex=%c, Score=%f\n\n",(*pstu).sex,(*pstu).score);
- printf("Number=%d, Name=%s\n",pstu->num,pstu->name);
- printf("Sex=%c, Score=%f\n",pstu->sex,pstu->score);
- return0;
- }
运行结果:
- Number=1, Name=He fang
- Sex=F, Score=92.500000
- Number=1, Name=He fang
- Sex=F, Score=92.500000
- Number=1, Name=He fang
- Sex=F, Score=92.500000
来源: http://www.jianshu.com/p/61257cd5830a