首页 百科知识 指针与结构数组

指针与结构数组

时间:2023-10-17 百科知识 版权反馈
【摘要】:同样地,当p_info指向了结构变量myinfo后,*p_info就代表了myinfo。结构数组是一个功能强大的编程工具,指向结构的指针也是如此。可以把两者结合起来使用,通过指针来存取结构数组中元素及各元素的成员。在程序运行到42行结束后,p_stu已经移到了数组stu的末尾。所以,在第62行要使p_stu重新指向数组的开头元素stu[1]。虽然数组名是指向数组开头的指针,并且指针是可以在算术表达式中修改的,但是,由于数组名是指针常量,所以不能在算术表达式中修改数组名。

5.3.2 指针与结构数组

在第4章,我们已经了解了结构的定义、赋值与应用的有关知识。结构这种数据也是存储到内存单元中的,因此它也有地址。有地址的变量就可以使用指针来访问它。下面介绍如何创建并使用指向结构的指针。首先定义一种结构:

img434

然后定义一个指向info结构的指针:struct info*p_info;

现在可以初始化该指针了吗?不能。因为已经定义了结构类型,但没有定义该结构类型的变量。别忘了,内存空间是和变量定义相对应的。由于指针需要指向内存地址,因此必须定义一个该结构类型的变量,指针才有指向。

  struct info myinfo;

现在,便可以初始化指针了:

  p_info=&myinfo;

如图5.3.3所示,说明了结构和指向它的指针之间的关系。

img435

图5.3.3 指向结构的指针

p_info指向结构的第—个字节。同样地,当p_info指向了结构变量myinfo后,*p_info就代表了myinfo。这样,通过p_info,可有两种方式引用结构变量myinfo的成员。

(1)使用结构成员引用运算符。

例如: (*p_info).num=101;

  scanf("%s",(*p_info).name);

注意:由于结构成员引用运算符(.)的优先级比间接运算符(*)高,因此必须用圆括号将*p_info括起来。

(2)使用指向结构成员运算符:−〉

例如:p_info−〉num=101;

  scanf("%s",p_info−〉name);

因此,有三种存取结构成员的方式:

1.通过结构变量名。

2.通过指向结构的指针和访问成员运算符(*)。

3.通过指向结构的指针和指向成员运算符(−〉)。

如果p_info是指向结构变量myinfo的指针,则下面的三个表达式是等价的:

  myinfo.num, (*p_info).num, p_info−〉num

结构数组是一个功能强大的编程工具,指向结构的指针也是如此。可以把两者结合起来使用,通过指针来存取结构数组中元素及各元素的成员。这里,将第4章例4.8简化后用指针处理。

例5-8 输入同学的信息并按身高从低到高排序,然后顺序输出姓名、生日和身高。

img436

img437

img438

在程序运行到42行结束后,p_stu已经移到了数组stu的末尾。所以,在第62行要使p_stu重新指向数组的开头元素stu[1]。

常见的编程错误5.3

img439 对不引用数组值的指针使用指针算术运算,是一个逻辑错误。

img440 将两个不引用同一数组元素的指针相减或进行比较,是一个逻辑错误。

img441 使用指针算术运算对指针进行自增或自减,以致该指针引用超出数组边界的元素,通常会形成一个逻辑错误。

常见的编程错误5.4

img442 将一个类型的指针赋给另一个类型(不是void*类型)的指针,而不先将第一个指针强制转换为第二个类型的指针,会造成一个编译错误。

常见的编程错误5.5

img443 虽然数组名是指向数组开头的指针,并且指针是可以在算术表达式中修改的,但是,由于数组名是指针常量,所以不能在算术表达式中修改数组名。

良好的编程习惯5.2

img444 为了使程序清晰,在操作数组时,使用数组表示法,而不要使用指针表示法。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈