❶ c語言中,如何將結構體里的數據 定義 為全局變數,因為我在其他文件中要用到這些變數
使用前聲明這些變數即可(使用extern關鍵字表示是外部定義過的變數)。但要注意,全局變數只能定義一次,否則就會犯重復定義的錯誤。
/*示例*/
file1.c
inti,j;//定義全局變數
charc;
voidfun()
{
}
/*************************************************************/
file2.c
externinti,j;//外部變數聲明
externcharc;
voidfunc1()
{
}
❷ C語言在一個函數裡面定義了一個結構體,怎麼在另外一個函數裡面使用
在另外一個函數裡面使用的源代碼如下:
#include"stdio.h"
#include "conio.h" //-------添加這個頭文件,因為getch()函數來自它,否則編譯會有警告
struct student /*定義結構體*/
{
void main()
{
void data_in(struct student putin[]);
void data_out(struct student *p);
void data_pout(struct student *s1);
data_in(pers); /*調用指針輸入函數*/
data_out(sp); /*調用指針輸出函數*/
data_pout(sp); /*調用函數名輸出函數*/
getch();
}
(2)c語言定義全局的結構體擴展閱讀
1、函數是C語言的基本組成元素,當我們調用一個函數時,需要明確函數名和實參列表。實參列表中的參數可以是常量、變數、表達式或者空,並且各參數之間要使用英文逗號分隔開來。
2、在C語言中,函數的定義是獨立的,一個函數不能定義在另一個函數內部。但在調用函數時,可以在一個函數中調用另一個函數,這就是函數的嵌套調用。接下來我們通過一個案例來演示函數的嵌套調用。
❸ c語言中如何定義一個結構體
結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。
結構體的成員可以包含其他結構體,也可以包含指向自己結構體類型的指針,而通常這種指針的應用是為了實現一些更高級的數據結構如鏈表和樹等。如果兩個結構體互相包含,則需要對其中一個結構體進行不完整聲明。
(3)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語言全局結構體變數定義初始化
我覺得是你用的編譯器不太嚴格,或者非常智能
如果是
extern stNum a;
stNum a = {1, 2};
還容易理解一點
❺ C語言頭文件中定義結構體的問題
C語言程序設計中,為防止頭文件在同一編譯單元被重復引用,常引入#ifndef宏來進行保護,如:頭文件my_head.h
#ifndef_MY_HEAD_H_//如果沒有定義宏_MY_HEAD_H_
#define_MY_HEAD_H_//則,定義該宏名
//以下是被保護的代碼區
//進行相應的全局變數和結構體類型定義
typedefstructstu{
inta;
intb;
}STU;
#endif//宏判斷結束
這樣,當整個代碼中,多次引用這個my_head.h時,只有一次是生效的,系統編譯時,如果檢查宏_MY_HEAD_H_ 已經定義,就不會再進入被保護的代碼區了。
PS: 宏名,一般是與頭文件名相同,只是把字母全大寫,前後加上下劃線(_)