當(dāng)我在學(xué)習(xí)結(jié)構(gòu)體方面知識(shí)時(shí)毯欣,在聲明如下結(jié)構(gòu)體時(shí)編譯報(bào)錯(cuò)。
#include<stdio.h>
void main(){
typedef struct A{
int a ;
char b;
float c ;
}a1={1,'2',111.1},*a2 = &a1;
printf("%d\n",a2->a);
}
錯(cuò)誤信息如下:
struct.c: In function ‘main’:
struct.c:8:5: error: typedef ‘a(chǎn)1’ is initialized (use __ typeof __ instead)
}a1={1,'2',111.1},a2 = &a1;
^
struct.c:8:5: error: typedef ‘a(chǎn)2’ is initialized (use typeof instead)
struct.c:8:30: error: expected expression before ‘a(chǎn)1’
}a1={1,'2',111.1},a2 = &a1;
^
struct.c:9:19: error: expected expression before ‘a(chǎn)2’
printf("%d\n",a2->a);
大概意思就是說(shuō)變量 a1 和 a2 已經(jīng)被typedef初始化了。可以看出typedef在錯(cuò)誤信息中出現(xiàn)的次數(shù)最多,所以我嘗試把代碼中的typedef去掉忿峻,最后編譯通過(guò)啦,輸出正確結(jié)果1.
雖然說(shuō)在我的嘗試下成功消除了bug辕羽,但是還是不懂typedef struct
和struct
在聲明結(jié)構(gòu)體時(shí)的區(qū)別逛尚。所以就查閱了一些資料,終于明白是怎么一會(huì)事刁愿。
typedef基本用法:
- 使用typedef為現(xiàn)有類型創(chuàng)建同義字绰寞,定義易于記憶的類型名 比如:
typedef long byte_4;
給已知數(shù)據(jù)類型long起個(gè)新名字,叫byte_4铣口。
- typedef 聲明結(jié)構(gòu)體
typedef struct tagMyStruct
{
int iNum;
long lLength;
}MyStruct;
這語(yǔ)句實(shí)際上完成兩個(gè)操作:
1 . 定義一個(gè)新的結(jié)構(gòu)類型
struct tagMyStruct{
int iNum;
long lLength;
};
分析:tagMyStruct
稱為“tag”滤钱,即“標(biāo)簽”,實(shí)際上是一個(gè)臨時(shí)名字脑题,struct關(guān)鍵字和tagMyStruct一起件缸,構(gòu)成了這個(gè)結(jié)構(gòu)類型,不論是否有typedef叔遂,這個(gè)結(jié)構(gòu)都存在他炊。
我們可以用struct tagMyStruct varName
來(lái)定義變量,但要注意已艰,使用tagMyStruct varName
來(lái)定義變量是不對(duì)的痊末,因?yàn)閟truct 和tagMyStruct合在一起才能表示一個(gè)結(jié)構(gòu)類型。
2 . typedef為這個(gè)新的結(jié)構(gòu)起了一個(gè)名字哩掺,叫MyStruct凿叠。typedef struct tagMyStruct MyStruct
;因此,MyStruct實(shí)際上相當(dāng)于struct tagMyStruct
嚼吞,我們可以使用MyStruct varName
來(lái)定義變量盒件。
說(shuō)到這里剛開(kāi)始的問(wèn)題就迎刃而解了,a1和struct A的作用是一樣的誊薄,都可以用來(lái)聲明結(jié)構(gòu)體變量,但自身并不是結(jié)構(gòu)體變量锰茉,不可以進(jìn)行賦值操作呢蔫。
可以修改為:
#include<stdio.h>
void main(){
struct A{
int a ;
char b;
float c ;
}a1={1,'2',111.1},*a2 = &a1;
printf("%d\n",a2->a); // 1
}
或者:
#include<stdio.h>
void main(){
typedef struct A{
int a ;
char b;
float c ;
}a1;
a1 a2; //使用a1聲明一個(gè)結(jié)構(gòu)體變量a2
a2.a=10;
printf("%d\n",a2.a);} // 10