我正在参与掘金创作者训练营第5期,点击了解活动详情
指针的优点
- 指向结构的指针通常比结构本身更容易操控
- 传递一个结构,传递指针更有效率
- 用于表示数据的结构中包含指向其他结构的指针
举一个简单例子:使用指针定义结构和访问结构成员
#include <stdio.h>
#define LEN 20
struct names {
char first[LEN];
char last[LEN];
};
struct guy{
struct names handle;
char favfood[LEN];
char job[LEN];
float income;
};
int main(){
struct guy fellow[2] = {
{{"Ewen","Villard"},
"grilled salmon",
"personaality coach",
68112.00
},
{{"Rodney","Swillbelly"},
"tripe",
"tabloid editor",
432400.00
}
};
struct guy*him; //这是一个指向结构指针
printf("address #1:%p #2:%p\n",&fellow[0],&fellow[1]);
him = &fellow[0]; //告诉编译器该指向何处
printf("pointer #1:%p #2:%p\n",him,him+1);
printf("him->income is $%.2f:(*him).income is $%.2f\n",him->income,(*him).income); //指向下一个结构
him++;
printf("him->favfood is %s:him->handle.last is %s\n",him->favfood,him->handle.last);
return 0;
}
运行结果
声明和初始化结构指针
声明一个结构指针:
struct guy * him
第一个是关键字struct,然后是星号( * ),后面跟着指针名。
虽然没有创建新的结构,但是指针him可以指向任意现有的guy类型的结构。例如,如果apple是guy类型的结构变量,可以这样表示:
him = &apple
与数组不同,结构变量名不是结构地址,所以一定要在结构变量名前面加上取地址运算符(&)。
上面举例中,fellow是一个结构数组,所以fellow[0]是一个结构,让him指向fellow[0],可以这样表示:him=&fellow[0];
him指向fellow[0],him+1指向fellow[1]。
用指针访问成员
him获取fellow[0]的成员的值,有两种方法:
- 使用->这个运算符。例如:
如果him == &barney,那么him->income即是barney.income
如果him == &fellow[0],那么him->income即是fellow[0].income
指向结构的指针后面的->运算符和结构变量名后面,都是一样的。
him是一个指针,但是him->income是指向结构的一个成员。因此,him->income是float类型的。
- 如果him == &fellow[0],那么* him == &fellow[0],因为&和* 是一对互逆运算符。可以换成这样表示:
fellow[0].income == (*him).income
必须使用圆括号,因为.运算符比* 运算符的优先级高。
如果him是指向guy类型结构barney的指针,下面成立:
barney.income == (*him).income == him->income //假设him == &barney