tft每日頭條

 > 圖文

 > 如何定義結構體變量

如何定義結構體變量

圖文 更新时间:2024-08-24 22:10:23

如何定義結構體變量?定義方式1:Typedef struct LNode { int data; // 數據域 struct LNode *next; // 指針域 } *LinkList; ,今天小編就來聊一聊關于如何定義結構體變量?接下來我們就一起去研究一下吧!

如何定義結構體變量(結構體變量和結構體類型的定義)1

如何定義結構體變量

1.結構體類型定義

定義方式1:

Typedef struct LNode { int data; // 數據域 struct LNode *next; // 指針域 } *LinkList;

定義方式2:

struct LNode { int data; // 數據域 struct LNode *next; // 指針域 }; Typedef struct LNode *LinkList;

以上兩個定義方式是等價的,是将 *LinkList 定 義為 struct LNode 類型,即 LinkList 被定義為一個類型名。這樣就可以用 LinkList 來定義說明新的變量了,如:

LinkList L;

即将 L 定義為 struct LNode 類型的指針變量。

2.結構體類型變量定義

定義方式1:

struct LNode { int data; // 數據域 struct LNode *next; // 指針域 }LnodeA;

定義方式2:

struct LNode { int data; // 數據域 struct LNode *next; // 指針域 }; struct LNode LnodeA;

以上兩個定義方式也是等價的,這樣就将 LnodeA 定義為一個 struct LNode 類型的變量,即 LnodeA 為一個 struct LNode 類型的變量名。


結構體内标的定義方式

1.結構體,透明表區,DATA ELEMENT,DOMAIN

透明表是對一個物理表的邏輯描述,透明表裡有許多字段,并且定義某些字段為 PRIMARY KEY,字段裡又包含 DATA ELEMENT,用來描述語言屬性和技術屬性。DATA ELEMENT 中又包含 DOMAIN,它是定義數據類型和字段長度。

結構體一般是用來定義一個結構變量,有臨時數據的儲存,沒有 PRIMARY KEY,結構體裡包含 COMPONENT 而不是 FIELD

2.Internal table 中的屬性分為三種 LINE TYPE ,KEY,TABLE KIND。

LINE TYPE 在 INTERNAL TABLE 裡單獨的一行叫 LINE TYPE,每一行的結構都一樣。

KEY:相當于數據庫裡的主鍵。在排序的時候有用,UNIQUE 或 NON-UNIQUE。

TABLE KIND:分為 STANDARD,SORTED,HASHED。

三種類型的内表的定義

标準表:

DATA itab1 TYPE STANDARD TABLE OF scarr WITH NON-UNIQUE KEY carrid.

排序表:

DATA itab2 TYPE SORTED TABLE OF scarr WITH NON-UNIQUE KEY carrid.

哈希表:

DATA itab3 TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.

一般定義方法(标準表)

根據數據庫表定義标準表

DATA itab4 TYPE TABLE OF scarr.

根據自建的結構變量定義标準表(最常用)

DATA: BEGIN OF wa, carrid TYPE scarr-carrid, carrnamen TYPE scarr-carrname, END OF wa. DATA itab5 LIKE TABLE OF wa.

根據數據字典中的表類型定義标準表

DATA itab6 TYPE ztabtype00_1.

根據内表定義内表

DATA itab7 LIKE itab6.

根據内表定義結構

DATA wa1 LIKE LINE OF itab7.

3. 定義結構的方式

根據數據字典中的表或者結構來定義程序的結構變量(或類型)

types str1 type spfli. data str2 type sflight.

自定義程序中的結構變量(或類型)-最常見的

data: begin of wa, carrid type spfli-carrid, com(10) type c, end of wa.

根據内表定義結構

data wa like line of itab.

注:根據數據庫表定義的一定是結構

同名字段的賦值(重要)

Move-corresponding A to B.

read 是讀取内表的一條數據

read table itab like table of wa.

讀一内表的多條數據應用 loop

loop at itab into wa.


C/C 語言中的解釋

結構體定義

結構體(struct)是由一系列具有相同類型或不同類型的數據構成的數據集合,也叫結構。

結構體作用

結構體和其他類型基礎數據類型一樣,例如 int 類型,char 類型 隻不過結構體可以做成你想要的數據類型。以方便日後的使用。

在實際項目中,結構體是大量存在的。研發人員常使用結構體來封裝一些屬性來組成新的類型。

結構體在函數中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關心這個是什麼,隻要根據定義使用就可以了。

結構體的大小與内存對齊

結構體的大小不是結構體元素單純相加就行的,因為我們現在主流的計算機使用的都是 32Bit 字長的 CPU,對這類型的 CPU 取 4 個字節的數要比取一個字節要高效,也更方便。所以在結構體中每個成員的首地址都是4的整數倍的話,取數據元素是就會相對更高效,這就是内存對齊的由來。

每個特定平台上的編譯器都有自己的默認"對齊系數"(也叫對齊模數)。程序員可以通過預編譯命令 #pragma pack(n),n=1,2,4,8,16 來改變這一系數,其中的n就是你要指定的"對齊系數"。

規則:

1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在 offset 為 0 的地方,以後每個數據成員的對齊按照 #pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。

2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊将按照< span class="marked">#pragma pack 指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。

3、結合1、2顆推斷:當#pragma pack的n值等于或超過所有數據成員長度的時候,這個n值的大小将不産生任何效果。

C 中的結構體

在 C 語言中,可以定義結構體類型,将多個相關的變量包裝成為一個整體使用。在結構體中的變量,可以是相同、部分相同,或完全不同的數據類型。在 C 語言中,結構體不能包含函數。在面向對象的程序設計中,對象具有狀态(屬性)和行為,狀态保存在成員變量中,行為通過成員方法(函數)來實現。C 語言中的結構體隻能描述一個對象的狀态,不能描述一個對象的行為。在 C 中,考慮到 C 語言到 C 語言過渡的連續性,對結構體進行了擴展,C 的結構體可以包含函數,這樣,C 的結構體也具有類的功能,與class 不同的是,結構體包含的函數默認為 public,而不是 private。

C 控制台輸出例子:

 

實例

#include <cstdlib> 

#include <iostream>  //定義結構體  

using namespace std; 

struct point 

{  

//包含兩個變量成員 

int x;  

int y; 

};  

int main(int argc, char *argv[]) 

{  

struct point pt; 

pt.x=1; 

pt.y=2; 

cout<<pt.x<<endl<<pt.y<<endl;

return EXIT_SUCCESS;

}

C 中的結構體與類的區别

類與結構體在 C 中隻有兩點區别,除此這外無任何區别。

(1)class 中默認的成員訪問權限是 private 的,而 struct 中則是 public 的。

(2)從 class 繼承默認是 private 繼承,而從 struct 繼承默認是 public 繼承。

這兩種定義有什麼區别?

typedef struct student { int num; struct student *next; }student; struct student { int num; struct student *next; };

第二個 struct student 是定義了一個 student 結構體,這個明白吧。

第一個是用 typedef 把 struct student 這個結構體類型名字重新定義為 student,也就是說 struct student 和 student 表示同一個事物,都是一個類型的标識符,比如 typedef int zhengshu; 就是你把整型 int 重命名為 zhengshu,下面定義:int i; 和 zhengshu i; 兩句就是等價的了。

結構是由基本數據類型構成的、并用一個标識符來命名的各種變量的組合。結構中可以使用不同的數據類型。

結構說明和結構變量定義

在 Turbo C 中,結構也是一種數據類型,可以使用結構變量,因此,象其它類型的變量一樣,在使用結構變量時要先對其定義。

定義結構變量的一般格式為:

struct 結構名 { 類型 變量名; 類型 變量名; ... } 結構變量;

結構名是結構的标識符不是變量名。

類型為第二節中所講述的五種數據類型(整型、浮點型、字符型、指針型和無值型)。

構成結構的每一個類型變量稱為結構成員,它象數組的元素一樣,但數組中元素是以下标來訪問的,而結構是按變量名字來訪問成員的。

下面舉一個例子來說明怎樣定義結構變量。

struct string { char name[8]; int age; char sex[4]; char depart[20]; float wage1,wage2,wage3; }person;

這個例子定義了一個結構名為 string 的結構變量 person,如果省略變量名 person,則變成對結構的說明。用已說明的結構名也可定義結構變量。這樣定義時上例變成:

struct string { char name[8]; int age; char sex[4]; char depart[20]; float wage1,wage2,wage3; }; struct string person;

如果需要定義多個具有相同形式的結構變量時用這種方法比較方便,它先作結構說明,再用結構名來定義變量。

例如:

struct string Tianyr, Liuqi, ...;

如果省略結構名,則稱之為無名結構,這種情況常常出現在函數内部,用這種結構時前面的例子變成:

struct { char name[8]; int age; char sex[4]; char depart[20]; float wage1,wage2,wage3; } Tianyr, Liuqi;

結構變量的使用

結構是一個新的數據類型,因此結構變量也可以象其它類型的變量一樣賦值、運算,不同的是結構變量以成員作為基本變量。

結構成員的表示方式為:

結構變量.成員名

如果将結構變量.成員名看成一個整體,則這個整體的數據類型與結構中該成員的數據類型相同,這樣就可象前面所講的變量那樣使用。

下面這個例子定義了一個結構變量,其中每個成員都從鍵盤接收數據,然後對結構中的浮點數求和,并顯示運算結果。請注意這個例子中不同結構成員的訪問。

實例

#include <stdio.h>

#include <conio.h>

int main()

{

struct

{

char name[8];

int age;

char sex[4];

char depart[20];

float wage1,wage2,wage3;

}a;

float wage;

char c='Y';

while(c=='Y'||c=='y')

{

printf(\nName:);

scanf(%s, a.name);

printf(Age:);

scanf(%d, &a.wage);

printf(Sex:);

scanf(%s, a.sex);

printf(Dept:);

scanf(%s, a.depart);

printf(Wage1:);

scanf(%f, &a.wage1);

printf(Wage2:);

scanf(%f, &a.wage2);

printf(Wage3:);

scanf(%f, &a.wage3);

wage=a.wage1 a.wage2 a.wage3;

printf(The sum of wage is %6.2f\n, wage);

printf(Continue?);

c=getche();

}

}

結構數組和結構指針

結構是一種新的數據類型, 同樣可以有結構數組和結構指針。

1.結構數組

結構數組就是具有相同結構類型的變量集合。假如要定義一個班級40個同學的姓名、性别、年齡和住址,可以定義成一個結構數組。如下所示:

struct { char name[8]; char sex[4]; int age; char addr[40]; }student[40];

也可定義為:

struct string { char name[8]; char sex[4]; int age; char addr[40]; }; struct string student[40];

需要指出的是結構數組成員的訪問是以數組元素為結構變量的, 其形式為:

結構數組元素.成員名

例如:

student[0].name student[30].age

實際上結構數組相當于一個二維構造, 第一維是結構數組元素, 每個元素是一個結構變量, 第二維是結構成員。

注意: 結構數組的成員也可以是數組變量。

例如:

struct a { int m[3][5]; float f; char s[20]; }y[4];

為了訪問結構a中結構變量 y[2] 的這個變量, 可寫成 y[2].m[1][4]

2.結構指針

結構指針是指向結構的指針。它由一個加在結構變量名前的* 操作符來定義, 例如用前面已說明的結構定義一個結構指針如下:

struct string { char name[8]; char sex[4]; int age; char addr[40]; }*student;

也可省略結構指針名隻作結構說明, 然後再用下面的語句定義結構指針。

struct string *student;

使用結構指針對結構成員的訪問,與結構變量對結構成員的訪問在表達方式上有所不同。結構指針對結構成員的訪問表示為:

結構指針名->結構成員

其中 -> 是兩個符号 -> 的組合,好象一個箭頭指向結構成員。例如要給上面定義的結構中 name 和 age 賦值,可以用下面語句:

strcpy(student->name, Lu G.C); student->age=18;

實際上,student->name 就是 (*student).name 的縮寫形式。

需要指出的是結構指針是指向結構的一個指針,即結構中第一個成員的首地址,因此在使用之前應該對結構指針初始化,即分配整個結構長度的字節空間,這可用下面函數完成, 仍以上例來說明如下:

student=(struct string*)malloc(size of (struct string));

size of (struct string) 自動求取 string 結構的字節長度, malloc() 函數定義了一個大小為結構長度的内存區域,然後将其詐地址作為結構指針返回。

注意:

1. 結構作為一種數據類型,因此定義的結構變量或結構指針變量同樣有局部變量和全程變量,視定義的位置而定。

2. 結構變量名不是指向該結構的地址,這與數組名的含義不同,因此若需要求結構中第一個成員的首地址應該是 &[結構變量名]

3. 結構的複雜形式:嵌套結構

嵌套結構是指在一個結構成員中可以包括其它一個結構,Turbo C 允許這種嵌套。

例如: 下面是一個有嵌套的結構

struct string { char name[8]; int age; struct addr address; } student;

其中: addr 為另一個結構的結構名, 必須要先進行, 說明, 即

struct addr { char city[20]; unsigned lon zipcode; char tel[14]; }

如果要給 student 結構中成員 address 結構中的 zipcode 賦值, 則可寫成:

student.address.zipcode=200001;

每個結構成員名從最外層直到最内層逐個被列出,即嵌套式結構成員的表達方式是:

結構變量名.嵌套結構變量名.結構成員名

其中嵌套結構可以有很多,結構成員名為最内層結構中不是結構的成員名。

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved