&n的運算結果事一個指針,指針的類型是int *,指針所指向的類型是int。(和等号左邊的p資訊比對上了) &p的運算結果事一個指針。指針的類型是int **,指針所指向的類型是int *。(和等号左邊的ptr資訊比對上了) printf("the value of p is %d\n",*p); 因為之前的p=&n,是以p指向的是n的位址。可是&p(p本身自己的位址)沒有變化。是以*p的值就是p指向的位址的内容。也就是4。*p的類型是int,是以這裡用%d進行輸出。 printf("the value of ptr is %x\n",*ptr); 同理。這裡ptr指向的是p的位址。 可是&ptr(ptr本身自己的位址)沒有變化。是以*ptr的值就是ptr指向的位址(p的位址)的内容。也就是n的位址。*ptr的類型是int *。是以這裡用%x進行輸出。 更加簡單直白地說,*就是降*操作符。&是升*操作符。
這裡先清晰一些概念,指針通過—>訪問結構體内部的變。而結構體本身是通過 . 來訪問自己的變量的。 是以p指向新建立結構體之後,通過printf("the content of p is %d and %x.\n",p->data,p->next);來訪問自己結構體内部的變量。 然後這裡比較複雜的可能是: content of n is %d and %x.\n",(*(p->next)).data,(*(p->next)).next); 這裡p->next指向的是n的存儲位址,然後我們用*取出了n的内容。然後通過.來訪問n自身的變量。有沒有感覺自己對指針熟悉了非常多呢?o(∩_∩)o
五、指針的強制類型轉換
C指針——C語言手記
我們要分析出為什麼能這樣做,要先了解以下幾個點: 1)結構體的構成
typedef struct node{
int data;
struct node *next;
};
以這裡結構體為例,int 類型是4個位元組。
struct node*類型是指針類型是以是4位元組。
是以有了第一個輸出8.
2)強制類型轉換之後的步長
強制類型轉換之後。步長也發生了變化。由于起始元素類型(一子產品中的指針指向的變量類型)變成了int,是以這裡的步長是sizeof(int)也就是4位元組。
printf("the
value of n is %d and %x.\n",*p,*(p+1));
這裡大家注意struct node的第一個變量int的步長也是4位元組。
是以(p+1)後從開始的起始位址剛好偏移了4位元組。然後得到了變量*next的起始位址,然後通過*取出其内容。
到這來就結束啦!祝願大家早日成為c語言的高手,假設上面有不對的地方。或者看完還有什麼疑惑。都歡迎大家指出來,一起讨論讨論。
轉載請注明:javascript:void(0)