c訪問c結構體
⑴ 關於C語言結構體訪問的問題。
放在.h頭文件中再#include是一個辦法
另一個辦法是使用extern關鍵字
首先要明白,編譯器是分別編譯源文件的,也就是分別編譯test.c和main.c
test.c中使用到main.c中定義的變數的話,在main.c中加上
externsomeTypevar;//比如externinta;
加上這行代碼編譯器才知道你確實在別的地方定義了這么一個東西,在連接階段linker會連接編譯階段分別生成的.obj文件,這時候就確實可以找到b這個變數了。
當然,對於你這個情況,用extern編譯器雖然知道了有b這么一個變數,但是還是不知道有
struct{
inta;
}
這么一個結構體類型,那編譯器當然不知道
b.a
表示的是什麼意思。還是報錯。所以還是用#include吧
⑵ C語言結構體指針成員所指向的變數如何訪問
結構體指針羨雀成員所指向變數,這個說法理爛指解起來有點困難。
從字面意思上看斷句,有如下幾種可能:
首先定義一個包含所有可能情況的結構體:
struct test
{
int a;
int *p;
};
struct test t1, *t2;1
結構體/指針成員/所指向的變數。
結構體中有指針成員,然後要訪問這個結構體成員指向的變數值。
那麼可以*(t1.p)這兄歷早種方式對p取值。
2
結構體指針/成員/所指向變數。
這種情況有兩種方法可以訪問:
*(t2->p)
或者
*(*(t2).p)
效果是一樣的。
3
描述有誤,實際為:
結構體指針所指向/成員變數。
同樣有兩種方法可以使用:
t2->p
或者
(*t2).p
⑶ C語言訪問一個結構體
//在C語言里,&用於取地址,沒用聲明參數的用法,你這樣用「SqQueue& Q」是不合法的
void InitQueue(SqQueue *Q)//SqQueue *Q是定義SqQueue類型的指針,與&Q的類型相同,
{
Q->base = (QElemType*)malloc(QUEUE_INIT_SIZE*sizeof(QElemType));
.......
}
main方法
int main()
{
QEIemType d;
SqQueue Q; //其它結構體沒什麼復雜的,除了要自己定義之外,與其它系統提供數據類型的用法是一樣的
InitQueue(&Q);//Q是結構體,加&就是到Q的地址,這里你可以把Q當作一個普通參數,在InitQueue函數里把Q當作指針對待。InitQueue函數里的Q與main里的Q不是一樣的。
......
}
⑷ C語言 對結構體類型的變數的成員的訪問,無論成員是何種數據類型都可使用的運算符是()。
通常,訪問一個結構體的變數的成員使用的運算符是點;比如一個結構體變數為sudent,它有一個成員為name,要訪問結構體變數student中的成員name,直接可使用student.name來訪問;
補充:當我們定義了一個指向結構體變數的指針時,可用運算符->去訪問他的成員。
⑸ C語言結構體指針成員所指向的變數如何訪問
第一種寫法:
(*a).p=&b;
.的優先順序高於*,(*pointer)兩邊的括弧不能少。如果去掉括弧寫作*pointer.memberName,那麼就等效於*(pointer.memberName),這樣意義就完全不對了。
第二種寫法:
a->p=&b;
->是一個新的運算符,習慣稱它為「箭頭」,有了它,可以通過結構體指針直接取得結構體成員;這也是->在C語言中的唯一用途。
結構體是一種數據類型,是一種創建變數的模板,編譯器不會為它分配內存空間,就像 int、float、char 這些關鍵字本身不佔用內存一樣;結構體變數才包含實實在在的數據,才需要內存來存儲。下面的寫法是錯誤的,不可能去取一個結構體名的地址,也不能將它賦值給其他變數。
(5)c訪問c結構體擴展閱讀:
用指針引用結構體變數成員方式總結與技巧:
一、(*指針變數飢兄名).成員名
注意,*p 兩邊的括弧不可省略,因為成員運算符「.」的優先順序高於指針運算符「*」,所以如果 *p 兩邊的括弧省略的話,那麼 *p.num 就等價於 *(p.num) 了。
因為指針變數 p 指向的是結構體變數第一個成員的地址,即字元數組爛棚襲 name 的首地址,所以 p 和 (*p).name 是等價的。
「等價」僅僅是說它們表示的是同一個內存單元的地址,但它們的類型是不同的。指針變數 p 是 struct 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能將 (*p).name 改成 p。用 %s 進行輸入或輸出時,輸入參數或輸出參數也只能寫成 (*p).name 而不能寫成 p。
二、直接用:指針變數名->成員名
來代替,它們是等價的。「->」是「指向結構體成員運算符」,它的優先順序同結構體成員運算符「.」一樣高和啟。p->num 的含義是:指針變數 p 所指向的結構體變數中的 num 成員。p->num 最終代表的就是 num 這個成員中的內容。
⑹ C語言對結構體文件的讀取
C語言中對結構體數據格式文件進行讀取時,必須以二進制格式打開文件,然後按結構體類型變數內存塊方式進行數據讀取,相關讀數據命令為fread()。
函數說明:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
從stream文件流中,讀取nmemb個size大小的數據塊到ptr所指的內存buf中,返回讀取到的有效數據塊數。
如,有如下結構體定義:
typedef struct TEST
{
int num;
double score;
}STRTEST;
STRTEST data ;
FILE *fp = fopen("file.dat", "rb" ) ; //按二進制格式打開文件
int n=fread( &data, sizeof(STRTEST), 1, fp ); //讀取一個數據塊到變數data中。
注意,當結構體中定義的變數有指針類型時,在存儲數據時,就不能按結構體進行存儲了。
因為,指針變數中存儲的是內存地址,而程序在不同環境運行時,所使用的內存地址是不同的,只存儲內存地址,不能把真正的數據保存下來,所以,即使是正確讀取到文件內容,也不能得到當時的結構體內存數據。因而,在存儲結構體數據時,要根據結構體類型變數特點採用正確的方法進行存儲,才能正確的讀取。