今天給大一的小孩講結構體,講到指向結構體的指針的時候,突然一個小孩提出了一個問題:指向結構體成員的指針p加1后指向誰?當時懵了,想寫個程序驗證一下,腦子一片空白。好像提問題的那個小孩聽明白的,就干脆讓他寫吧。哈哈,他還挺厲害的,他寫的代碼大體是這樣的:
#include<stdio.h>
struct data
{
int a;
int b;
int c;
};
int main()
{
struct data a[ 3]={
{ 11, 12, 13},
{ 21, 22, 23},
{ 31, 32, 33}
};
int *p=&a[ 0].c; // *p=13
p++;
printf( " %d\n ",*p);
struct data
{
int a;
int b;
int c;
};
int main()
{
struct data a[ 3]={
{ 11, 12, 13},
{ 21, 22, 23},
{ 31, 32, 33}
};
int *p=&a[ 0].c; // *p=13
p++;
printf( " %d\n ",*p);
}
大家認為會輸出什么?是23嗎?
出人意料,輸出的結果是21
我是這么解釋的:因為p是指向int *型的,所以指針后移一個int單位,或者說后移四個存儲單元,又因為結構體是連續存儲的,所以后移之后就指向下一個結構體的第一個元素,也就是21。如果我們將int a;改為double a;輸出為0,這就驗證了我的觀點 ,同樣,如果將int a;改為char a;的話,這樣就會和后面的數據混起來,輸出為2293525,可以認為無效數字。
所以,一般情況下我們只用只指向結構體的指針,而不用指向結構體成員的指針。