C 如何将指针与结构数组一起使用?
我试图找出如何使用指针访问struct数组C 如何将指针与结构数组一起使用?,c,pointers,struct,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 eleme
#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;
}
错误是
invalid type of argument '->'(have'struct p')
我必须将ptr1声明为指针数组吗?
如果我不知道struct数组的大小,如何声明指针数组
这里还有一个问题,指针的大小应该是多少?sizeof(ptr1)?
我试过这行代码
printf("size of ptr1 = %i",sizeof(ptr1));
答案是4?!!为什么
如果要使用
ptr1
访问结构中的下一个元素,即第二个元素,请在值上使用数组表示法,谢谢
int secondX = ptr1[1].x
char secondY = ptr1[1].y
sizeof(ptr1)
表达式返回4
,因为这是x86平台上指针的典型大小如果要使用ptr1
访问下一个,即结构中的第二个元素,只需在值上使用数组表示法即可
int secondX = ptr1[1].x
char secondY = ptr1[1].y
sizeof(ptr1)
表达式返回4
,因为这是x86平台上指针的典型大小如果要访问struct类型数组的第二个元素,只需按如下方式递增指针:
ptr1++;
现在,指针将指向struct类型数组的第二个元素
你的第二个答案是:
指针保存变量的地址,变量的地址被视为整数值。所以基于机器的指针大小也是整数。签入您的机器整数大小应该是4,这就是为什么它显示指针4的大小 如果要访问struct类型数组的第二个元素,则只需按如下方式递增指针:
ptr1++;
现在,指针将指向struct类型数组的第二个元素
你的第二个答案是:
指针保存变量的地址,变量的地址被视为整数值。所以基于机器的指针大小也是整数。签入您的机器整数大小应该是4,这就是为什么它显示指针4的大小 通过使用数组索引符号
[]
,可以有效地取消对指针的引用。例如,可以编写ptr1[1]
((ptr1)+(1))。换句话说,ptr1[1]
属于struct p
类型,而不是struct p*
因为它不是指针,所以必须使用
操作符来访问结构的元素。例如,将代码更改为ptr1[1].x
。如果要使用->
符号,可以改为编写(ptr1+1)->x
。->
运算符取消对指针的引用
如果需要,可以使用(*(ptr1+1)).x来完成同样的任务,更明确地取消对指针的引用,但这可能会阻止某些编译器优化代码,并且可读性较差(许多CPU允许索引访问,因此ptr1[1]
可能只需要一条指令,而*(ptr1+1)
可能需要3条指令:ptr
的加载操作、do+1的添加操作和解引用操作。)
在回答您的另一个问题时,
sizeof ptr1
是4,因为这是您计算机上指针的大小。例如,我的示例打印8,因为它是64位的,每个字节有8位。我猜您运行的是32位操作系统,所以它打印4,因为它是32位的,每个字节有8位。使用数组索引符号[]
,有效地解除了指针的引用。例如,ptr1[1]
可以编写*((ptr1)+(1))
。换句话说,ptr1[1]
是struct p
类型,而不是struct p*
因为它不是指针,所以必须使用
运算符来访问结构的元素。例如,将代码更改为ptr1[1]。x
可以工作。如果要使用->
符号,可以改为编写(ptr1+1)->x
。->
运算符取消对指针的引用
如果需要,可以使用(*(ptr1+1)).x来完成同样的任务,更明确地取消对指针的引用,但这可能会阻止某些编译器优化代码,并且可读性较差(许多CPU允许索引访问,因此ptr1[1]
可能只需要一条指令,而*(ptr1+1)
可能需要3条指令:ptr
的加载操作、do+1的添加操作和解引用操作。)
在回答您的另一个问题时,
sizeof ptr1
是4,因为这是您计算机上指针的大小。例如,我的示例打印8,因为它是64位的,每个字节有8位。我猜您运行的是32位操作系统,所以它打印4,因为它是32位的,每个字节有8位。printf(%I%c\n),(ptr1+1)->x,(ptr1+1)->y)printf(“%i%c\n”,(ptr1+1)->x,(ptr1+1)->y);
structp1[]={1,'c'},92,3,94,5,96};当我编写此代码,然后打印大小(p1),猜猜答案是什么?32…为什么?虽然有6个整数(4*6=24),只有一个字符(24+1=25)那么它是如何打印32的?要理解这一点,你应该知道编译器的对齐属性。如果你从中删除所有元素,那么它的sizeof(p1)是8而不是5。编译器这样做是为了提高性能。struct p p1[]={{1,'c'},92,3,94,5,96};当我写这段代码时,然后打印sizeof(p1),猜猜答案是什么?32…为什么?虽然有6个整数(4*6=24)和一个字符(24+1=25),但它是如何打印32的?要理解这一点,你应该知道编译器的对齐属性。如果你从中删除所有元素,那么它的大小(p1)是8而不是5。编译器这样做是为了提高性能。