c語言結構體教程
① c語言結構體Struct怎麼使用
在C語言中,可以使用結構體(Struct)來存放一組不同類型的數據。結構體的定義形式為:
struct 結構體名{
結構體所包含的變數或數組
};
結構體是一種集合,它裡麵包含了多個變數或數組,它們的類型可以相同,也可以不同,每個這樣的變數或數組都稱為結構體的成員(Member)。
結構體定義:
第一種:只有結構體定義
struct stuff{
char job[20];
int age;
float height;
};
第二種:附加該結構體類型的「結構體變數」的初始化的結構體定義
//直接帶變數名Huqinwei
struct stuff{
char job[20];
int age;
float height;
}Huqinwei;
也許初期看不習慣容易困惑,其實這就相當於:
struct stuff{
char job[20];
int age;
float height;
};
struct stuff Huqinwei;
第三種:如果該結構體只用一個變數Huqinwei,而不再需要用struct stuff yourname;去定義第二個變數。
那麼,附加變數初始化的結構體定義還可進一步簡化出第三種:
struct{
char job[20];
int age;
float height;
}Huqinwei;
把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變數了——至少我現在沒掌握這種方法。
結構體變數及其內部成員變數的定義及訪問。
要分清結構體變數和結構體內部成員變數的概念。
就像剛才的第二種提到的,結構體變數的聲明可以用:
struct stuff yourname;
其成員變數的定義可以隨聲明進行: struct stuff Huqinwei = {"manager",30,185};
也可以考慮結構體之間的賦值:
struct stuff faker = Huqinwei;
//或 struct stuff faker2;
// faker2 = faker;
列印,可見結構體的每一個成員變數一模一樣
如果不使用上邊兩種方法,那麼成員數組的操作會稍微麻煩(用for循環可能好點)
Huqinwei.job[0] = 'M';
Huqinwei.job[1] = 'a';
Huqinwei.age = 27;
Huqinwei.height = 185;
結構體成員變數的訪問除了可以藉助符號".",還可以用"->"訪問。
(1)c語言結構體教程擴展閱讀:
結構體數組與結構體指針:
一個結構體變數中可以存放一組數據;如一個學生的學號、姓名、成績等數據。如果有10個學生的數據需要參加運算顯然應該用數組,這就是結構體數組結構體數組與以前介紹過的數值型數組不同之處:每個數組元素都是一個結構體類型的數據,它們都分別包括各個成員(分量)項。
結構體指針和其他類型的指針都是一樣的理解,在32位平台不管啥類型的指針都佔4個位元組的空間。
結構體指針就是指向結構體變數的指針;如果一個指針變數中保存了結構體變數的首地址,那麼這個指針變數就指向該結構體變數.通過結構體指針即可訪問該結構體變數,這與數組指針和函數指針的情況是相同的結構指針變數說明的一般形式為:
struct 結構體名 *結構體指針變數名struct student *p = &Boy; //假設事先定義了 struct student Boy。
② c語言中如何定義一個結構體
結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。
結構體的成員可以包含其他結構體,也可以包含指向自己結構體類型的指針,而通常這種指針的應用是為了實現一些更高級的數據結構如鏈表和樹等。如果兩個結構體互相包含,則需要對其中一個結構體進行不完整聲明。
(2)c語言結構體教程擴展閱讀:
一、結構體作用:
結構體和其他類型基礎數據類型一樣,例如int類型,char類型,只不過結構體可以做成你想要的數據類型,以方便日後的使用。
在實際項目中,結構體是大量存在的,研發人員常使用結構體來封裝一些屬性來組成新的類型。由於C語言內部程序比較簡單,研發人員通常使用結構體創造新的「屬性」,其目的是簡化運算。
結構體在函數中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關心這個是什麼,只要根據定義使用就可以了。
二、結構體的大小與內存對齊:
結構體的大小不是結構體元素單純相加就行的,因為我們主流的計算機使用的都是32bit字長的CPU,對這類型的CPU取4個位元組的數要比取一個位元組要高效,也更方便。
所以在結構體中每個成員的首地址都是4的整數倍的話,取數據元素時就會相對更高效,這就是內存對齊的由來。每個特定平台上的編譯器都有自己的默認「對齊系數」(也叫對齊模數)。
程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的「對齊系數」。
三、結構體的規則:
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
3、結合1、2可推斷:當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。
③ c語言結構體輸入
number是指針,指向常量字元串,輸入的時候,改變的其實是number的空間,也就是出現了野指針,導致程序出錯
修改方式很簡單,把char*number,改成char number[100]就可以了
只改定義一處,其他的不需要改動
具體大小,取決於你的需求
④ 用c語言!c語言!結構體編程。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedefstruct
{
charNo[20];
charname[20];
charauthor[20];
floatprice;
}BOOKINFO;
intmain()
{
BOOKINFOs[10];
inti;
for(i=0;i<10;i++)
{
printf(" 請輸入第%d本書的書號書名作者價格(分別用空格間隔):",i+1);
scanf("%s%s%s%f",s[i].No,s[i].name,s[i].author,&s[i].price);
}
printf(" 請輸入要查找的書名:");
chartemp[20];
scanf("%s",temp);
for(i=0;i<10;i++)
{
if(strcmp(temp,s[i].name)==0)
{
printf(" 找到! ");
printf("%s%s%s%.2f",s[i].No,s[i].name,s[i].author,s[i].price);
break;
}
}
if(i>=10)
{
printf(" 未找到!");
}
printf(" 請輸入一個價格:");
floatt;
scanf("%f",&t);
for(i=0;i<10;i++)
{
if(s[i].price>t)
{
printf("%s%s%s%.2f ",s[i].No,s[i].name,s[i].author,s[i].price);
}
}
return0;
}
⑤ C語言結構體的用法,
結構體的使用,首先要定義:
#include<stdio.h>
structstudent
{
charname[10];
intnum;
intage;
};//注意要分號
//然後就可以使用了:
voidmain()
{
structstudents;
structstudent*p=&s;//指針指向,可以不用指針
printf("inputname:");
gets(s.name);//若使用指針,則:gets(p->name);
printf("inputnum:");
scanf("%d",&s.num);//指針的寫法:scanf("%d",&p->num);
printf("inputage:");
scanf("%d",&s.age);
//輸出結果:
printf("name num age ");
printf("%s %d %d ");
}
結構體類似於數組,但結構體能定義不同的數據類型,這也是它的特別之處
⑥ 用C語言(結構體)編寫程序
|正好有個現成的:#include"stdio.h"
#define yes 1
#define no 0typedef struct date
{
int year;
int month;
int day;
}DATE;
long timedef(DATE d1,DATE d2);
int leap(int year);
int main()
{
DATE date1,date2;
date1.year=2008;
date1.month=11;
date1.day=1;
date2.year=2009;
date2.month=12;
date2.day=1; printf("%ld\n",timedef(date1,date2));}
int leap(int year)
{
if(year%400==0 ||(year%4==0&&year%100!=0))
return yes;
else
return no;
}
long timedef(DATE d1,DATE d2)
{
int i;
long day=0,dayt1=0,dayt2=0;
int d[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
for(i=d1.year;i<d2.year;i++)
if(leap(i)==no) day+=365;
else day+=366; for(i=1;i<d1.month;++i) dayt1+=d[leap(d1.year)][i];
dayt1+=d1.day; for(i=1;i<d2.month;++i) dayt2+=d[leap(d2.year)][i];
dayt2+=d2.day; return day+dayt2-dayt1;
}
⑦ C語言結構體定義
C語言結構體定義:struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。
結構體是C語言中聚合數據類型(aggregatedatatype)的一類。結構體可以被聲明為變數、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
(7)c語言結構體教程擴展閱讀
1、struct是聲明結構體類型時必須使用的關鍵字,不能省略。「結構體」這個詞是根據英文單詞structure譯出的。
2、structSTUDENT是定義的數據類型的名字,它向編譯系統聲明這是一個「結構體類型」,包括name、num、sex、age、score、addr等不同類型的項。
3、structSTUDENT與系統提供的int、char、float、double等標准類型名一樣,都是數據類型,具有同樣的作用,都是用來定義變數的。
⑧ c語言結構體怎麼用函數實現
#include<stdio.h>
#include<malloc.h>
structstu//結構體
{
intage;
floatscore;
charname[100];
};
voidshuru(intlen,stu*pArr)
{
inti;
for(i=0;i<len;i++)
{
printf("請輸入第%d個學生的信息 ",i+1);
printf("name=");
scanf("%s",pArr[i].name);
printf("age=");
scanf("%d",&pArr[i].age);
printf("score=");
scanf("%f",&pArr[i].score);
}
return;
}
intmain(void)
{
intlen,i;
structstu*pArr,t;
printf("請輸入學生的個數: ");
printf("人數=");
scanf("%d",&len);
pArr=(structstu*)malloc(len*sizeof(structstu));
shuru(len,pArr);
for(i=0;i<len;i++)
{
if(pArr[i].score<pArr[i+1].score)
{
t=pArr[i+1];
pArr[i+1]=pArr[i];
pArr[i]=t;
}
}
i=0;
printf(" 排序後的學生信息為 ");
for(i=0;i<len;i++)
{
printf("name=%s ",pArr[i].name);
printf("age=%d ",pArr[i].age);
printf("score=%f ",pArr[i].score);
printf(" ");
}
return0;
}
這樣就行了,你的排序還沒實現, 仿照輸入的函數實現就OK
⑨ c語言中結構體怎麼寫
以struct打頭,後面可以跟結構體名稱,然後大括弧中寫出結構體組成,比如:
struct Student { int number; float score[5]; };
其中Student就是結構體名稱,這個名稱可以當作自定義的數據類型來使用
Student a[10];