1. 程式人生 > 其它 >C語言結構體陣列的指標運用

C語言結構體陣列的指標運用

技術標籤:C和指標C語言c語言C和指標

【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個位元組。

表示式表示式
nodes200(十進位制地址)&nodes[3].c->a200(十進位制地址)
nodes.aillegal&nodes->a200(十進位制地址)
nodes[3].a12npnodes[2]
nodes[3].c200(十進位制地址)np->a22
nodes[3].c->a5np->c->c->a15
*nodesnodes[0]npp216(十進位制地址)
*nodes.aillegalnpp->aillegal
(*nodes).a5*npp248(十進位制地址)
nodes->a5**nppnodes[4]
nodes[3].b->b248(十進位制地址)*npp->aillegal
*nodes[3].b->bnodes[4](*npp)->a18
&nodes200(十進位制地址)&np未知
&nodes[3].a236(十進位制地址)&np->a224
&nodes[3].c244(十進位制地址)&np->c->c->a212

大部分都比較清楚,有個別說明一下:

npp是nodes[1]中b的地址,其內容是nodes+4也就是nodes[4]的地址,(*npp)->a這樣才可以訪問a。

*npp就是nodes[4]的地址,那**npp就是nodes[4]

運算子的優先順序需要注意,比如&np->c->c->a,&取地址符號是最後優先順序。