1、指向結(jié)構(gòu)體的指針變量:
C 語言中->是一個整體,它是用于指向結(jié)構(gòu)體,假設(shè)我們在程序中定義了一個結(jié)構(gòu)體,然后聲明一個指針變量指向這個結(jié)構(gòu)體,那么我們要用指針取出結(jié)構(gòu)體中的數(shù)據(jù),就要用到指向運(yùn)算符“->”.
舉例說明:
struct SunLL
{
int a;
int b;
int c;
};
struct SunLL * p; //定義結(jié)構(gòu)體指針
struct SunLL A = {1,2,3}; //定義一個SunLL類型的變量A
int x; //定義一個變量x
p = &A ; //讓p指向A
x = p->a; //等價于 x=(*p).a (*p)表示p指向的結(jié)構(gòu)體變量
//這句話的意思就是取出p所指向的結(jié)構(gòu)體中包含的數(shù)據(jù)項(xiàng)a賦值給x
//由于此時p指向A,因而 p->a == A.a,也就是1
2、指向結(jié)構(gòu)體數(shù)組的指針變量:
指向結(jié)構(gòu)體的指針變量也可以指向結(jié)構(gòu)體數(shù)組及其元素。
如果程序如下:
struct SunLL *p,sun[3];
p = sun;
如果假定sun[0]的地址是1000,指針變量p指向結(jié)構(gòu)體數(shù)組sun的首地址,由于size of(struct SunLL)的值是6,每個結(jié)構(gòu)體元素占內(nèi)存空間6個字節(jié),因此p+1指向地址1006,p+2指向地址1012.
使用指針變量指向結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)組時,應(yīng)注意運(yùn)算符的優(yōu)先級,在c語言中"()" "[ ]" "->" "."四個優(yōu)先級相同,具有最高的優(yōu)先級,其次是”*“ ”++“ ”--“ ”&“四個相同優(yōu)先級的運(yùn)算符。如:++P->a的表達(dá)式等價于++(p->a)
(++p)->a先計(jì)算++p,p指向sun[1];
P++->a;則表達(dá)式等價于(p++)->a;
p->a++的表達(dá)式等價于(p->a)++;
3、結(jié)構(gòu)體作為函數(shù)參數(shù)與結(jié)構(gòu)體指針作為函數(shù)參數(shù)
舉例1
struct st
{
int a;
char b;
};
fun(struct st bc)
{
bc.a+=5;
bc.b='A';
printf("%d,%c\n",bc.a,bc.b);
}
main()
{
struct st bl;
bl.a=3;
bl.b="c";
fun(bl);
printf("%d,%c\n",bl.a,bl.b);
}
運(yùn)行結(jié)果為:8,A 3,c
舉例2:
struct st
{
int a;
char b;
};
fun(struct st *bp)
{
bp->a+=5;
bp->b='A';
printf("%d,%c\n",bc.a,bc.b);
}
main()
{
struct st bl;
bl.a=3;
bl.b="c";
fun(&bl);
printf("%d,%c\n",bl.a,bl.b);
}
運(yùn)行結(jié)果為:8,A 8,A
總結(jié):
將結(jié)構(gòu)體變量作為函數(shù)參數(shù),是將實(shí)參值傳遞給形參,屬于值傳遞。將結(jié)構(gòu)體所有參數(shù)傳遞給形參使用,但本身的值不會改變。將指向結(jié)構(gòu)體變量的指針作為實(shí)參進(jìn)行傳遞時,是將結(jié)構(gòu)體變量的地址傳遞給形參,屬于地址傳遞,會改變實(shí)際結(jié)構(gòu)體變量的成員值的。