一提指針,那可是C語言的核心了,有多少學子曾拜倒在指針的腳下。單純的說指針,其實並不難,但是與其它的結構搭配在一起,那可就愁死人了。比如說:數組一點都不難,但是與指針一起用,可就經常麻煩了。結構體也是一種結構,它與指針搭配怎麼樣呢? 一起來看一下吧!
和指針指向數組首地址一樣,指針也可以指向結構體的起始地址。
形式形如: struct student *p;
上述語句定義了一個指針變量p,它指向任何一個屬於struct student 類型的數據。通過指針去訪問所指結構體變量的某個成員時,有兩種方法:
(*p).score 或者 p->score(這是一種常用的方式。->是指向運算符)
比如:
訪問的時候:(*p).num=11031,或者 p->num=11031。
#include <stdio.h> /*定義結構體*/ struct student { int num; char name[20]; char sex; int age; float score; }; /*初始化一個結構體實例*/ 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的結構體的首地址賦給p,也就是p指向了student 1的首地址 /*輸出:可以看到,訪問結構體的成員,有三種方法*/ printf("%s,%c,%f\n",student1.name,(*p).sex,p->score); q=stu;//將數組stu的首地址賦給q; /*for循環輸出數組中的成員*/ for(i=0;i<3;i++,q++) { printf("%s,%c,%f\n",q->name,(*q).sex,stu[i].score); } }
P->num
P指向的結構體中的成員
P->num++
先得到p所指向的結構體成員num,然後使該num的值加1
++p->num
先p所指向成員num的值加1,然後引用這個新的值
(p++)->num
先引用p->num的值,用完之後再使p加1
(++p)->num
先p加1,然後引用p->num的值
結構體變量以及結構體指針變量均可以像int類型那樣作為函數的參數。
#include <stdio.h> /*定義結構體*/ struct student { int num; char name[20]; char sex; int age; float score; }; /*初始化一個結構體實例*/ struct student stu[3]={ {11302,"Wang",'F',20,486.69}, {11303,"Zhao",'F',25,466.59}, {11304,"Xue",'M',18,483.59} }; /*輸出函數,結構體變量s做為函數參數*/ void print(struct student s) { printf("%s,%d,%f\n",s.name,s.age,s.score); } /*增加成績的函數,結構體指針q作為函數參數*/ 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] } }
上述程序注意的是:調用函數print和add都是void無返回值類型的函數,如果是有返回值的,它的類型應該是struct student類型,也就是說應該是
語言
struct student add(struct student *q) { if(q->age<=19) q->score=q->score+10; return *q }
本文出自 “趙玉強的博客” 博客,請務必保留此出處http://zhaoyuqiang.blog.51cto.com/6328846/1292014