1. 程式人生 > >對C語言 結構陣列 指向結構變數的指標 指向結構陣列的指標

對C語言 結構陣列 指向結構變數的指標 指向結構陣列的指標

一、結構陣列的定義

陣列的元素可以是結構型別的。結構陣列的每一個元素都是具有相同的結構型別的下標結構變數。在實際應用中,經常用結構陣列來表示具有相同資料結構的一個群體。

如:一個班的學生的檔案,一個車間職工的工資等。

struct stu

{

Int num;

char *name;

char sex[20];

float score;

}boy[5];

定義了一個結構陣列boy,共有5個元素,boy[0]~boy[4].每個陣列元素都有struct stu的結構形式。對陣列結構可以做初始化賦值。

#include<stdio.h>
struct stu
{
	int num;
	char *name;
	char sex;
	float score;
}boy[5] = {
	{101,"shi",'w',46},
	{102,"wen",'m',76},
	{103,"jie",'w',89.8},
	{104,"jier",'m',25},
	{105,"dada",'w',65},
	};
int main(int argc,char **argv)
{
	int i;
	int c=0;
	float ave;
	float s = 0;
	
	for(i=0;i<5;i++) 
	{
		s += boy[i].score;
		if (boy[i].score < 60)
		{
			c+=1;
		}
	printf("num=%d,name=%s,sex=%c,score=%2.f\n",boy[i].num,boy[i].name,boy[i].sex,boy[i].score);
        }
	printf("s=%f\n",s);
	ave = s/5;
	printf("ave=%f\ncount=%d\n",ave,c);
	return 0;
}

本例程式中定義了一個外部結構陣列boy,總共5個元素,並做了初始化賦值。在main函式中用for語句逐漸累加各個元素的score,成員值存於s之中,如score的值小於60(不及格)即計數器C加1,迴圈完畢後計算平均成績,並輸出全班總分,平均分以及不及格人數。

二、指向結構變數的指標

一個指標變數當用來指向一個結構變數時,稱之為結構指標變數。結構指標變數的值指向的是結構變數的首地址。

通過結構指標即可訪問該結構變數。

結構指標變數的說明一般的格式為:    

        Struct stu *pstu;

訪問的一般形式為:

結構指標變數->成員名

例如:(*pstu).num;

或者是:

Pstu->num;

/*

結構指標變數的具體說明和使用方法

*/

/*

本例程式中定義了一個結構體stu,定義了型別結構變數boy1並做了初始化賦值,還定義了一個指向stu型別結構的指標變數pstu。在main函式中,pstu被賦予boy1的地址,因此pstu指向boy1,。然後在printf語句中用三種形式的輸出boy1的各個成員值。

從運算結果可以看出:

結構變數.成員名

(*結構指標變數).成員名

結構指標變數->成員名

*/

#include<stdio.h>
struct stu 
{
	int num;
	char name[20];
	char sex;
	float score;
}boy1 = {102,"shi wen jie",'w',48},*pstu;
int main(int argc,char **argv)
{
	pstu = &boy1;
	printf("num=%d\t,name=%s\t,sex=%c\t,score=%f\n",boy1.num,boy1.name,boy1.sex,boy1.score);
	printf("num=%d\t,name=%s\t,sex=%c\t,score=%f\n",(*pstu).num,(*pstu).name,(*pstu).sex,(*pstu).score);
	printf("num=%d\t,name=%s\t,sex=%c\t,score=%f\n",pstu->num,pstu->name,pstu->sex,pstu->score);
	return 0;
}

三、指向結構陣列的指標

指標變數可以指向一個結構陣列,這時結構指標變數的值是整個結構陣列的首地址。結構指標變數也可以指向結構陣列的一個元素,這時的結構指標變數的值是該結構陣列元素的首地址。

***ps為指向結構陣列的指標變數,則ps也是指向該結構陣列的0號元素,ps+1指向1號元素,ps+i則指向i號元素。

/*

在程式中定義了stu結構型別的外部陣列boy並做了初始化賦值。在main中定義了ps為指向stu型別的指標。在迴圈語句for的表示式1中,ps被賦予boy的首地址,然後迴圈5次,輸出boy中陣列中的成員值。

*/

/*
用指標變數輸出結構陣列
*/
#include<stdio.h>
struct stu
{
	int num;
	char name[8];
	char sex;
	float score;
}boy[5] = {
		{101,"shi",'w',65},
		{102,"wen",'m',89},
		{103,"jie",'w',86},	
		{104,"jie jie",'m',70},
		{105,"hi",'m',76},
		
};
int main(int argc,char **argv)
{
	struct stu *ps;
	printf("num\tname\tsex\tscore\n");
	for(ps=boy;ps<boy+5;ps++)
	{
		printf("%d\t%s\t%c\t%f\n",ps->num,ps->name,ps->sex,ps->score);
	}
	return 0;
}

***可以看出 結構指標變數可以訪問結構變數或結構陣列元素的成員,但是不能使他指向一個成員。也就是說,不允許取一個成員的地址來賦予它。

錯誤的:ps  =  &boy[1].sex;

正確的:ps  = boy;(賦予陣列首地址)      ps = &boy[0];(賦予0號元素首地址)