C語言結構體陣列的指標運用
阿新 • • 發佈:2021-02-06
【10-7】考慮下面這些宣告和資料。
struct NODE{ int a; struct NODE *b; struct NODE *c; }; struct NODE nodes[5] = { {5, nodes + 3, NULL}, {15, nodes + 4, nodes + 3}, {22, NULL, nodes + 4}, {12, nodes + 1, nodes}, {18, nodes + 2, nodes + 1} }; (other declarations...) struct NODE *np = nodes + 2; struct NODE **npp = &nodes[1].b;
對下面的表示式求值,並寫出它的值,同時,寫明任何表示式求值過程中可能出現的副作用,你應該用最初顯示的值對每個表示式求值(也就是說,不要使用某個表示式的結果來對下一個表示式求值)。假定nodes陣列在記憶體中的起始位置為200,並且在這臺機器上整數和指標的長度都是4個位元組。
表示式 | 值 | 表示式 | 值 |
nodes | 200(十進位制地址) | &nodes[3].c->a | 200(十進位制地址) |
nodes.a | illegal | &nodes->a | 200(十進位制地址) |
nodes[3].a | 12 | np | nodes[2] |
nodes[3].c | 200(十進位制地址) | np->a | 22 |
nodes[3].c->a | 5 | np->c->c->a | 15 |
*nodes | nodes[0] | npp | 216(十進位制地址) |
*nodes.a | illegal | npp->a | illegal |
(*nodes).a | 5 | *npp | 248(十進位制地址) |
nodes->a | 5 | **npp | nodes[4] |
nodes[3].b->b | 248(十進位制地址) | *npp->a | illegal |
*nodes[3].b->b | nodes[4] | (*npp)->a | 18 |
&nodes | 200(十進位制地址) | &np | 未知 |
&nodes[3].a | 236(十進位制地址) | &np->a | 224 |
&nodes[3].c | 244(十進位制地址) | &np->c->c->a | 212 |
大部分都比較清楚,有個別說明一下:
npp是nodes[1]中b的地址,其內容是nodes+4也就是nodes[4]的地址,(*npp)->a這樣才可以訪問a。
*npp就是nodes[4]的地址,那**npp就是nodes[4]
運算子的優先順序需要注意,比如&np->c->c->a,&取地址符號是最後優先順序。