如何使用带有struct数组的指针?

时间:2014-01-12 05:06:25

标签: c pointers struct

我试图找出如何使用指针访问struct

数组
#include<stdio.h>

struct p
{
int x;
char y;
};


int main()
{
struct p p1[]={1,92,3,94,5,96};
struct p *ptr1=p1;

printf("size of p1 = %i\n",sizeof(p1));

//here is my question, how can I use ptr1 to access the next element of the array
//of the struct?
printf("%i %c\n",ptr1->x,ptr1->y);      

int x=(sizeof(p1)/3);
if(x == sizeof(int)+sizeof(char))
    printf("%d\n",ptr1->x);
else
    printf("falsen\n");
return 0;
}

//这是我的问题,如何使用ptr1访问数组的下一个元素    结构? 我试着编写这行代码,但出现了错误

printf("%i %c\n",ptr1[0]->x,ptr1[1]->y);

错误是

invalid type of argument '->'(have'struct p')

我必须将ptr1声明为指针数组吗? 如果我不知道struct数组的大小,我怎么能声明一个指针数组,

这里的另一个问题是,指针的大小应该是多少?的sizeof(ptr1的)? 我试过这行代码

printf("size of ptr1 = %i",sizeof(ptr1));

答案是4?!!怎么样?

感谢

3 个答案:

答案 0 :(得分:2)

如果你想使用ptr1访问结构中的下一个元素,即第二个元素,只需在值上使用数组表示法

int secondX = ptr1[1].x
char secondY = ptr1[1].y

sizeof(ptr1)表达式返回4,因为这是x86平台上指针的典型大小

答案 1 :(得分:2)

如果要访问struct类型数组的第二个元素,则只需递增增量指针Like:

  ptr1++;

现在指针将指向struct type数组的第二个元素。

你的第二个答案是:

指针保存变量的地址,变量的地址被视为整数值。所以基于机器指针的大小也是整数。检查你的机器的整数大小应该是4,这就是为什么它显示指针4的大小。

答案 2 :(得分:1)

通过使用数组索引表示法[ ],您可以有效地取消引用指针。例如,ptr1[1]可以写为*((ptr1)+(1))。换句话说,ptr1[1]的类型为struct p,而不是struct p *

因为它不是指针,所以必须使用.运算符来访问结构的元素。例如,将代码更改为ptr1[1].x可以正常工作。如果您想使用->表示法,则可以改为编写(ptr1 + 1)->x->运算符取消引用指针。

如果你愿意,你可以使用(*(ptr1 + 1)).x来完成相同的事情,更明确地解除引用指针,但是这可能会阻止某些编译器优化你的代码并且也不太可读(许多CPU允许索引)访问使得ptr1[1]可能只需要1条指令,而*(ptr1 + 1)可能需要3条指令:ptr的加载操作,+1的加法运算和解除引用操作。)

在回答您的其他问题时,sizeof ptr1为4,因为这是您计算机上指针的大小。我的例如打印8因为它是64位并且每字节有8位。我猜你有一个运行的32位操作系统,因此它打印4,因为它是32位,每字节8位。