簡體   English   中英

如何使用帶有結構體數組的指針?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM