我想做一些類似于下面的代碼,但使用ptr[i]
printf("%s%d
", (ptr i)->主題, (ptr i)->標記)。
uj5u.com熱心網友回復:
ptr->x與(*ptr).x相同。
*(ptr i)與ptr[i]相同。
因此,根據傳遞屬性,(ptr i)->x等于:
ptr[i].x
uj5u.com熱心網友回復:
問題可能是如何解除對一個結構的指標的參考。
一些可能的方法:
typedef struct
{[/span>
int marks;
char *subject;
}型別。
void foo(type *ptr, ssize_t i)
{
printf("%s %d
", (ptr i) -> subject, (ptr i) -> marks) 。
printf("%s %d
", (*(ptr i)).subject, (*(ptr i)).marks)。
printf("%s %d
", ptr[i].subject, ptr[i].marks)。)
printf("%s %d
", (&ptr[i]) -> subject, (&ptr[i]) -> marks);
}
uj5u.com熱心網友回復:
是的。
用[i]進行索引,完全等同于添加i并對由此產生的地址進行解參考。索引只是 "語法糖",是一種方便和習慣性的簡稱。事實上,索引操作是定義的增加一個偏移量和解除參考。p[i]等同于*(p i)。
將索引定義為加法和去參考的一個更意想不到的后果是,由于加法是換元的(即,p i == i p對所有p,i都成立),從表面上看,索引也是一個對稱的運算子:對所有p[i] i[p]是一個有效、等價的表達:
#include <stdio.h>
int main()
{
//一個帶有int成員的匿名結構陣列。
struct { int mI; } arr[] = { {1}, {2}, {3}. } ;
// "sizeof arr/sizeof *arr" 。
//將一個陣列的整體大小除以一個元素的大小。
//是一種習慣性的方法,可以遍歷所有的元素而不需要在意。
//關于精確計數。
for(int i=0; i < sizeof arr/sizeof *arr; i )
{
//列印的運算式都是等價的。
printf( "%i is the same as ")
"%i與"相同。
"%i與"相同。
"%i與"相同。
"%i與"相同。
"%i
"。
arr[i].mI。
//令人驚訝。索引是交換性的。
//這可能無法通過代碼審查,但它是完全合法的C.。
i[arr].mI,
(*(arr i)).mI。
(arr i)->mI, //通過指標訪問結構成員的簡稱
(*(i arr)).mI, ///不那么令人驚訝。加法是交換性的
(i arr)->mI
);
}
}
示例會話:
$ gcc -Wall -o symmetrical symmetrical.c && ./symmetrical
1與1相同,1與1是相同的1是相同的1。
2與2是相同的2是相同的。 數字">2與2是相同的2是相同的2。
3與3是相同的3是相同的。 數字">3與3是一樣的3與3是一樣的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/315490.html
標籤:
上一篇:我如何獲得指向結構末尾的指標?
