考慮下面的一段代碼:
typedef struct
{
int out;
struct
{
int in1;
struct
{
int in_int2;
char in_char2;
} inner2[3];
} inner1[2];
} outer;
outer o1;
我如何使用指標指向內部結構,比如說o1.inner[0].inner[1]并將值分配給相同的?
即(提供用于解釋的偽代碼。正在詢問確切的語法:
pointer *my_p = o1.inner[0].inner[1];
my_p->in_int2 = 2;
uj5u.com熱心網友回復:
你所有的內部結構都是匿名的,所以沒有辦法參考它們。您需要為每個結構命名:
typedef struct
{
int out ;
struct inner1
{
int in1;
struct inner2
{
int in_int2;
char in_char2;
}inner2[3];
}inner1[2];
}outer;
然后你可以創建一個指向正確型別的指標:
struct inner2 *my_p = &o1.inner1[0].inner2[1];
uj5u.com熱心網友回復:
純 c 中的唯一選項是:
1. 為內部結構命名
這樣你就可以參考內部結構的具體型別來宣告指標:
typedef struct
{
int out;
struct inner1
{
int in1;
struct inner2
{
int in_int2;
char in_char2;
} inner2[3];
} inner1[2];
} outer;
// Usage:
int main() {
outer o1;
struct inner2 *ptr = &o1.inner1[1].inner2[2];
// ...
}
2. 定義第二個等效結構作為指標型別
通過定義具有完全相同成員的結構,您可以將指標轉換為該已知結構。
如果您無法修改outer.
typedef struct
{
int out;
struct
{
int in1;
struct
{
int in_int2;
char in_char2;
} inner2[3];
} inner1[2];
} outer;
// Usage:
int main() {
outer o1;
struct inner_type { int in_int2; char in_char2; };
struct inner_type* ptr = (struct inner_type*)&o1.inner1[1].inner2[2];
// ...
}
3. 直接使用指向命名成員的指標
您也可以只使用指向in_int2/ 的指標in_char2,這樣您就不必處理未命名的結構:
typedef struct
{
int out;
struct
{
int in1;
struct
{
int in_int2;
char in_char2;
} inner2[3];
} inner1[2];
} outer;
int main() {
outer o1;
int* ptr_in_int2 = &o1.inner1[1].inner2[2].in_int2;
char* ptr_in_char2 = &o1.inner1[1].inner2[2].in_char2;
// ...
}
4.非標 typeof()
如果您可以使用編譯器擴展,則 gcc 和 clang 都提供typeof(),它允許您獲取任意運算式的型別。
您可以使用它來創建指向未命名結構的指標,例如:
typedef struct
{
int out;
struct
{
int in1;
struct
{
int in_int2;
char in_char2;
} inner2[3];
} inner1[2];
} outer;
int main() {
outer o1;
typeof(o1.inner1[0].inner2[0])* ptr = &o1.inner1[1].inner2[2];
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/372360.html
上一篇:如果(*ptr)[variable]表示“指向陣列的指標”,那么(*ptr)[variable]='\0'是什么意思?
下一篇:漢堡選單僅使用CSS不起作用
