C語言學(xué)習(xí)筆記之 結(jié)構(gòu)體指針變量一提指針,那可是C語言的核心了,有多少學(xué)子曾拜倒在指針的腳下。單純的說指針,其實并不難,但是與其它的結(jié)構(gòu)搭配在一起,那可就愁死人了。比如說:數(shù)組一點都不難,但是與指針一起用,可就經(jīng)常麻煩了。結(jié)構(gòu)體也是一種結(jié)構(gòu),它與指針搭配怎么樣呢? 一起來看一下吧! 1:結(jié)構(gòu)體指針變量和指針指向數(shù)組首地址一樣,指針也可以指向結(jié)構(gòu)體的起始地址。 形式形如: struct student *p; 上述語句定義了一個指針變量p,它指向任何一個屬于struct student 類型的數(shù)據(jù)。通過指針去訪問所指結(jié)構(gòu)體變量的某個成員時,有兩種方法: (*p).score 或者 p->score(這是一種常用的方式。->是指向運算符) 比如:
訪問的時候:(*p).num=11031,或者 p->num=11031。
2.程序?qū)嵗?/span>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h>
/*定義結(jié)構(gòu)體*/
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
};
/*初始化一個結(jié)構(gòu)體實例*/
struct student stu[3]={
{11302, "Wang" , 'F' ,20,486.69},
{11303, "Zhao" , 'F' ,25,466.59},
{11304, "Xue" , 'M' ,26,483.59}
};
main()
{
/*初始化一個student1的實例*/
struct student student1={11305, "Li" , 'F' ,19,59.59};
struct student *p,*q; //定義struct student類型的指針
int i;
p=&student1; //將student 1的結(jié)構(gòu)體的首地址賦給p,也就是p指向了student 1的首地址
/*輸出:可以看到,訪問結(jié)構(gòu)體的成員,有三種方法*/
printf ( "%s,%c,%f\n" ,student1.name,(*p).sex,p->score);
q=stu; //將數(shù)組stu的首地址賦給q;
/*for循環(huán)輸出數(shù)組中的成員*/
for (i=0;i<3;i++,q++)
{
printf ( "%s,%c,%f\n" ,q->name,(*q).sex,stu[i].score);
}
}
|
|
3.指針符號(->)P->num | P指向的結(jié)構(gòu)體中的成員 | P->num++ | 先得到p所指向的結(jié)構(gòu)體成員num,然后使該num的值加1 | ++p->num | 先p所指向成員num的值加1,然后引用這個新的值 | (p++)->num | 先引用p->num的值,用完之后再使p加1 | (++p)->num | 先p加1,然后引用p->num的值 |
4.結(jié)構(gòu)體變量和結(jié)構(gòu)體指針變量做函數(shù)參數(shù) 結(jié)構(gòu)體變量以及結(jié)構(gòu)體指針變量均可以像int類型那樣作為函數(shù)的參數(shù)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <stdio.h>
/*定義結(jié)構(gòu)體*/
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
};
/*初始化一個結(jié)構(gòu)體實例*/
struct student stu[3]={
{11302, "Wang" , 'F' ,20,486.69},
{11303, "Zhao" , 'F' ,25,466.59},
{11304, "Xue" , 'M' ,18,483.59}
};
/*輸出函數(shù),結(jié)構(gòu)體變量s做為函數(shù)參數(shù)*/
void print( struct student s)
{
printf ( "%s,%d,%f\n" ,s.name,s.age,s.score);
}
/*增加成績的函數(shù),結(jié)構(gòu)體指針q作為函數(shù)參數(shù)*/
void add( struct student *q)
{
if (q->age<=19)
q->score=q->score+10;
}
main()
{
struct student *p;
int i;
for (i=0;i<3;i++)
{
print(stu[i]); //stu[i]作為形參
}
for (i=0,p=stu;i<3;i++,p++)
{
add(p); //指向stu的指針變量p作為形參
}
printf ( "\n" );
for (i=0,p=stu;i<3;i++,p++)
{
print(*p); //*p作為形參,相當于stu[i]
}
}
|
|
上述程序注意的是:調(diào)用函數(shù)print和add都是void無返回值類型的函數(shù),如果是有返回值的,它的類型應(yīng)該是struct student類型,也就是說應(yīng)該是 語言
1 2 3 4 5 6 | struct student add(struct student *q)
{
if (q->age<= 19 )
q->score=q->score+ 10 ;
return *q
}
|
|
|