我试图找出如何使用指针访问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?!!怎么样?
感谢
答案 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位。