Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将指针与结构数组一起使用?_C_Pointers_Struct - Fatal编程技术网

C 如何将指针与结构数组一起使用?

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

我试图找出如何使用指针访问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;
}
错误是

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。编译器这样做是为了提高性能。