就像數組一樣,指向結構體的指針存儲了結構體第一個元素的內存地址。與數組指針一樣,結構體的指針必須聲明和結構體類型保持一致,或者聲明為void類型。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
struct
person {
int
age;
char
*name;
};
struct
person first;
struct
person *ptr;
first.age = 21;
char
*fullname =
"full name"
;
first.name = fullname;
ptr = &first;
printf
(
"age=%d, name=%s\n"
, first.age, ptr->name);
|
第1至6行聲明了一個person結構體,一個變量指向了一個person結構體和指向person結構體的指針。第8行為age成員賦了一個int值。第9至10行我們聲明了一個char指針並賦值給一個char數組並賦值給結構體name成員。第11行我們把一個person結構體引用賦值給結構體變量。
第13行我們打印了結構體實例的age和name。這里需要注意兩個不同的符號,’.’ 和 ‘->’ 。結構體實例可以通過使用 ‘.’ 符號訪問age變量。對於結構體實例的指針,我們可以通過 ‘->’ 符號訪問name變量。也可以同樣通過(*ptr).name來訪問name變量。
指針和結構類型的關系
可以聲明一個指向結構類型對象的指針。
例十一:
structMyStruct
{
inta;
intb;
intc;
}
MyStructss={20,30,40};
//聲明了結構對象ss,並把ss的三個成員初始化為20,30和40。
MyStruct*ptr=&ss;
//聲明了一個指向結構對象ss的指針。它的類型是MyStruct*,它指向的類型是MyStruct。
int*pstr=(int*)&ss;
//聲明了一個指向結構對象ss的指針。但是它的類型和它指向的類型和ptr是不同的。
請問怎樣通過指針ptr來訪問ss的三個成員變量?
答案:
ptr->a;
ptr->b;
ptr->c;