[英]How to use a pointer with an array of 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?!!怎么來?
謝謝
如果要使用ptr1
訪問結構中的下一個(即第二個)元素,則只需對值使用數組符號
int secondX = ptr1[1].x
char secondY = ptr1[1].y
sizeof(ptr1)
表達式返回4
因為這是x86平台上指針的典型大小
如果要訪問結構類型數組的第二個元素,則只需遞增增量指針,如:
ptr1++;
現在,指針將指向結構類型數組的第二個元素。
您的第二個答案是:
指針保存變量的地址,並且變量的地址被視為整數值。 因此基於機器的指針大小也為整數。 檢入計算機的整數大小應為4,這就是顯示指針大小4的原因。
通過使用數組索引符號[ ]
,可以有效地取消引用指針。 例如,可以將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位OS,因此它打印4,因為它是32位,每字節8位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.