㈠ c語言結構體Struct怎麼使用
在Turbo C中,結構也是一種數據類型, 可以使用結構變數,因此,像其它類型的變數一樣,在使用結構變數時要先對其定義。
如果需要定義多個具有相同形式的結構變數時用這種方法比較方便,它先作結構說明,再用結構名來定義變數。
(1)c語言訪問結構體擴展閱讀
指向結構體的指針是一個一直都沒有掌握好的點,希望這里能記錄好一點,加強理解。
對於指針有幾個好處,
第一:就像指向數組的指針比數組本身更容易操作一樣,指向結構的指針通常也更容易操作;
第二:在早期的C中參數傳遞只能使用結構的指針;
第三:很多奇妙的數據表示都是用了包含指向其他結構的指針的結構。
和數組不同,結構的名字不是該結構的地址(即單獨的結構名並不是該結構地址的同義詞),必須使用 & 運算符。
參考資料c語言結構體struct相關使用說明
㈡ C語言中struct 結構體 成員的訪問問題
這主要得看a是什麼類型,如果a是結構體變數(比如OS_MEM_DATA
a),那麼就是a.b。
如果是結構體指針變數(如OS_MEM_DATA
*a),那麼就是a->b。
a->b等價於(*a).b。
㈢ C語言,結構體,訪問,運算符
選擇B,箭頭運算符。
有幾種訪問結構體的方法:
訪問結構成員的運算符有兩種,一種是結構成員運算符「·」,也稱為「圓點運算符」,另一種是結構指針運算符「->」,也稱「箭頭運算符」。
結構成員運算符通過結構變數名訪問結構體的成員。例如:
printf("%s",student.name);
結構指針運算符由減號「-」和「>」組成(中間沒有空格),它通過指向結構的指針訪問結構的成員。假定聲明了指向struct student的指針sPtr,並且把結構student1的地址賦給了sPtr,如下列語句通過指針sPtr列印了結構student1的成員name:
printf("%s",sPtr->name);
不要在結構指針運算符的-和>之間插入空格。
在用指針和結構成員運算符引用結構成員時一定要用圓括弧(*sPtr).name,因為結構成員運算符「.」比指針復引用運算符「*」的優先順序高,所以圓括弧是必須的。
下面的程序演示了結構成員和結構指針運算符的用法:
#include<stdio.h>
struct student
{char *name;
char *sex;
};
main()
{
struct student student1;
struct student *sPtr;
student1.name="Tom";
student1.sex="male";
sPtr=&student1;
printf("%s%s%s\n%s%s%s\n%s%s%s\n",
student1.name,"'s sex is",student1.sex,
sPtr->name,"'s sex is",sPtr->sex,
(*sPtr).name,"'s sex is",(*sPter).sex);
return 0;
}
補充說明:圓點運算符是比較古老的寫法,不能訪問結構體指針變數成員,
現在都推薦使用箭頭運算符,即->
㈣ c語言 結構體訪問成員(·)是什麼意思,理解不到。
因為結構是一個集合,由若干成員構成,訪問其成員就用下面這個形式:
結構變數名.成員名
舉例如下:
struct person //定義結構類型
{
int weight,height;
float salary;
}
struct person zhangsan;//定義結構變數名
以下是訪問結構成員:
zhangsan.height=176;
zhangsan.salary=6588;
㈤ c語言結構體調用
#include <stdio.h>
struct person
{
char name[10];
int num;
};
void main()
{
struct person per[5];
void sort(struct person *, int );
int i;
printf("print letter:\n");
for(i=0;i<5;i++)
{
printf("name: ");
scanf("%s", &per[i].name);
printf("num: ");
scanf("%d", &per[i].num);
}
sort(per, 5);
for(i=0;i<5;i++)
printf("print: %s%d\n", per[i].name, per[i].num);
getch();
}
void sort(struct person *a, int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i].num>a[j].num)
{
t=a[i].num; /*你代碼中i寫成j,這是細節問題*/
a[i].num=a[j].num;
a[j].num=t;
}
}
你代碼有點問題,我給你改了改。TC測試通過。
除了注視的地方,還有幾點要注意:
你源代碼傳送的是per[0].num的地址,記:a[0],但是a[1]的地址不等於
per[1].num的地址。
指針加1的意思你沒理解好。
舉個列子。
int a[10];
那麼*(a+1)的意思是把a地址向後移動sizeof(int)個位。
所以你那個&a[1]指向的還是結構體中的數據。(恩,這里體現了低級語言的特性。每一個內存的每一位都要考慮到。要是你寫個程序:200位的浮點數加法計算機,你更能體會到什麼叫做考慮到每一位內存,調試的時候要一個內存一個內存的演算。代碼我的空間里有,可以自己去看)
不懂的問
㈥ c語言將文本文件讀取到結構體中
呵呵,滿意的話要給我追加分哦!那兩個例子都是我自己給你寫的。
1.
#include"stdio.h"
#include"stdlib.h"
main()
{
FILE *fp;
char s[100];
if((fp=fopen("f:\\score.txt","a"))==NULL)
{
printf("Can't open destination file!\n");
exit(0);
}
printf("Please input your name:");
gets(s);
fprintf(fp,"Name:%s\t\tScore:%d\n",s,rand()%100);
fclose(fp);
printf("Your score is saved!\n");
}
2.
#include"stdio.h"
#define N 20
struct score
{
char s[20];
int a;
}d[N];
main()
{
FILE *fp;
int i,no=0;
if((fp=fopen("f:\\score.txt","r"))==NULL)
{
printf("Can't open destination file!\n");
exit(0);
}
for(i=0;i<N&&!feof(fp);i++)
{
fscanf(fp,"Name:%s\t\tScore:%d\n",d[i].s,&d[i].a);
no++;
}
fclose(fp);
for(i=0;i<no&&d[i].s[0];i++)
printf("Name:%s\t\tScore:%d\n",d[i].s,d[i].a);
}
在文件中分隔用什麼隨便你,但是當你用什麼分隔後,在用fscanf函數的時候也要在格式控制中加入,如我用第一個程序保存了些數據在f:\\score.txt中:
Name:ytyh Score:1
Name:tytuy Score:41
Name:hjhj Score:41
由於我在第一個程序中用的是fprintf(fp,"Name:%s\t\tScore:%d\n",s,rand()%100);故在第二個程序中就心須用fscanf(fp,"Name:%s\t\tScore:%d\n",d[i].s,&d[i].a);
在ASCII文件中我只知道這樣,但在二進制文件中就沒有這么麻煩,直接用fread就行。
㈦ 如何在c語言中的結構體如何調用
結構體定義好後就把他當成數據類型來用,你貼出具體的代碼吧,這樣能說清楚點
㈧ C語言關於指針訪問結構體數據的使用
呵呵,很簡單,你只要把x堪稱一塊內存就可以了。
x相當於:
+---------------------------+
|1|2|3|4|1|2|3|4|5|6|7|8|9|a|
+---------------------------+
|---n---|---------str-------|
我們從圖中可以看到n其實佔了四個位元組的內存,而str佔了10個位元組。
那麼str[5]相當於從頭開始算跳過了九個位元組,那麼p[9]就是正好是str[5]的地方,也可以*(p+9)形象的說明了跳過了9個位元組。
㈨ C語言中struct 結構體 成員的訪問問題
這主要得看a是什麼類型,如果a是結構體變數(比如OS_MEM_DATA a),那麼就是a.b。
如果是結構體指針變數(如OS_MEM_DATA *a),那麼就是a->b。
a->b等價於(*a).b。
㈩ C語言問題:結構體裡面的成員,如果想按位訪問。。。
不同的編譯器對位欄位有不同的類型範圍,GCC以及VC++就不允許數組位欄位,而BCB則允許