鶴山區(qū)網(wǎng)站建設(shè)關(guān)鍵詞排名點(diǎn)擊軟件
🌞 “少年有夢(mèng)不至于心動(dòng),更要付諸行動(dòng)?!?/strong> 今天我們一起學(xué)習(xí)一下結(jié)構(gòu)體的相關(guān)內(nèi)容!
結(jié)構(gòu)體
- 🎈1.結(jié)構(gòu)體的聲明
- 1.1結(jié)構(gòu)的基礎(chǔ)知識(shí)
- 1.2結(jié)構(gòu)的聲明
- 1.3結(jié)構(gòu)成員的類型
- 1.4結(jié)構(gòu)體變量的定義和初始化
- 🎈2.結(jié)構(gòu)體成員的訪問
- 2.1結(jié)構(gòu)體變量訪問成員
- 2.2結(jié)構(gòu)體指針訪問指向變量的成員
- 🎈3.結(jié)構(gòu)體傳參
🎈1.結(jié)構(gòu)體的聲明
1.1結(jié)構(gòu)的基礎(chǔ)知識(shí)
📖結(jié)構(gòu)是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)的每個(gè)成員可以是不同類型的變量。
1.2結(jié)構(gòu)的聲明
📝為什么會(huì)出現(xiàn)結(jié)構(gòu)體呢?在我們當(dāng)前的一些學(xué)習(xí)中,我們學(xué)過的類型都是內(nèi)置類型,例如:char short int double
等等。但是,它們無(wú)法描述一個(gè)復(fù)雜的對(duì)象,比方說人,我們很難用一個(gè)類型描述出它。相反,我們可能需要通過性別、年齡、身高、體重等等來(lái)進(jìn)行描述。
🧩對(duì)于結(jié)構(gòu)體的聲明,格式如下:
struct tag
{member-list;//成員變量的列表
}variable-list;//變量列表
📖下面,給出一個(gè)學(xué)生的結(jié)構(gòu)體的聲明:
struct Stu//struct是結(jié)構(gòu)體的關(guān)鍵字
{//學(xué)生的相關(guān)屬性char name[20];//姓名int age;//年齡char sex[5];//性別char tele[12];//電話
}s3,s4;
//s3,s4是結(jié)構(gòu)體類型的變量,但是s3,s4是全局變量。
int main()
{struct Stu s1;struct Stu s2;//s1,s2也是結(jié)構(gòu)體類型的變量,但是是局部變量return 0;
}
🔎這里的話,可能有的同學(xué)在想,如果每次在主函數(shù)內(nèi)來(lái)定義一個(gè)結(jié)構(gòu)體變量都要加struct Stu
是不是太麻煩了,能不能把這個(gè)去掉呢,或者說有沒有更簡(jiǎn)單的表達(dá)方法呢?我們這個(gè)時(shí)候,就需要用到typedef
(typedef顧名思義是類型定義的,這里理解為類型重命名。鏈接: 關(guān)于關(guān)鍵字講解的鏈接)那么,程序可以做以下修改:
typedef struct Stu//struct是結(jié)構(gòu)體的關(guān)鍵字
{//學(xué)生的相關(guān)屬性char name[20];//姓名int age;//年齡char sex[5];//性別char tele[12];//電話
}Stu;//Stu是重命名產(chǎn)生的新的類型
int main()
{Stu s1;Stu s2;//s1,s2是結(jié)構(gòu)體類型的變量return 0;
}
1.3結(jié)構(gòu)成員的類型
📖結(jié)構(gòu)體成員的類型可以是標(biāo)量、數(shù)組、指針,甚至是其他結(jié)構(gòu)體。
struct B
{int a;short b;
};
struct C
{char c;int num;int arr[10];double* p;struct B b;struct B* p;
};
1.4結(jié)構(gòu)體變量的定義和初始化
🧩結(jié)構(gòu)體變量的定義:
struct A
{int age;char sex;
}a1;//a1是全局變量
struct A a2;//a2也是全局變量
int main()
{struct A a3;//局部變量return 0;
}
📖當(dāng)我們想要給這些變量一些值的時(shí)候,我們就需要對(duì)變量進(jìn)行初始化:
struct A
{int age;char sex;int arr[10];
}a1;//a1是全局變量
struct A a2;//a2也是全局變量
int main()
{//對(duì)于結(jié)構(gòu)體的初始化可以用一對(duì)大括號(hào)來(lái)進(jìn)行//按照順序初始化struct A a3 = { 18,'M',{1,2,3,4,5,6,7,8,9,10} };//局部變量//給指定的成員初始化struct A a4 = { .age = 20,.arr = {6,6,6} };return 0;
}
🔎我們可以通過監(jiān)視來(lái)看看變量初始化的情況:
🎈2.結(jié)構(gòu)體成員的訪問
2.1結(jié)構(gòu)體變量訪問成員
📖結(jié)構(gòu)變量的成員通過點(diǎn)操作符
(.)
訪問的,點(diǎn)操作符要接受兩個(gè)操作數(shù)。
下面我們給出示例,帶大家了解一下:
#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A t)
{t.age = 10;//t.name = "zhangsan";//這里我們發(fā)現(xiàn)會(huì)報(bào)錯(cuò),因?yàn)閚ame是數(shù)組名,數(shù)組是常量的地址,不能改變,這里我們就需要用到strcpy函數(shù)來(lái)進(jìn)行拷貝strcpy(t.name, "zhangsan");//字符串拷貝t.sex = 'M';
}
int main()
{struct A a = { 0 };//寫一個(gè)函數(shù)給a中存放數(shù)據(jù)Set_a(a);return 0;
}
🔎我們上面這段代碼對(duì)不對(duì)呢?變量a是否被初始化了呢?這里,我們調(diào)試著看一看:
🧩我們發(fā)現(xiàn)a并沒有被初始化,這是為什么呢?
?注意:實(shí)參傳遞給形參的時(shí)候,形參是實(shí)參的一份臨時(shí)拷貝,對(duì)形參的修改不會(huì)影響實(shí)參?
🎈通過前面的學(xué)習(xí),我們知道這里應(yīng)該通過傳地址的方式來(lái)改變實(shí)參的值:
#include <stdio.h>
#include <string.h>///strcpy函數(shù)的頭文件
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A *t)
{(*t).age = 10;//t.name = "zhangsan";//這里我們發(fā)現(xiàn)會(huì)報(bào)錯(cuò),因?yàn)閚ame是數(shù)組名,數(shù)組是常量的地址,不能改變,這里我們就需要用到strcpy函數(shù)來(lái)進(jìn)行拷貝strcpy((*t).name, "zhangsan");//字符串拷貝(*t).sex = 'M';
}
int main()
{struct A a = { 0 };//寫一個(gè)函數(shù)給a中存放數(shù)據(jù)Set_a(&a);return 0;
}
🌞同樣的,既然這里我們用到了指針,不妨可以用指針訪問指向變量的成員!
2.2結(jié)構(gòu)體指針訪問指向變量的成員
📖通過結(jié)構(gòu)體指針來(lái)訪問成員可以通過操作符
->
來(lái)實(shí)現(xiàn)。
🧩上述代碼可以做以下修改,結(jié)果相同:
#include <stdio.h>
#include <string.h>
struct A
{char name[20];int age;char sex;
};
void Set_a(struct A* t)
{t->age = 10;strcpy(t->name, "zhangsan");//字符串拷貝t->sex = 'M';
}
int main()
{struct A a = { 0 };//寫一個(gè)函數(shù)給a中存放數(shù)據(jù)Set_a(&a);return 0;
}
🎈3.結(jié)構(gòu)體傳參
#include <stdio.h>
struct B
{int date[100];int num;
};
struct B b = { {1,2,3},12 };
void Print1(struct B b)
{printf("%d\n", b.num);
}
void Print2(struct B *b)
{printf("%d\n", b->num);
}
int main()
{Print1(b);Print2(&b);return 0;
}
🔎對(duì)于上面兩個(gè)函數(shù)
Print1和Print2
,用哪個(gè)更好呢?這里我們選擇函數(shù)Print2
!
?注:函數(shù)傳參的時(shí)候,參數(shù)是需要壓棧的?如果傳遞一個(gè)結(jié)構(gòu)體對(duì)象的時(shí)候,結(jié)構(gòu)體過大,參數(shù)壓棧的系統(tǒng)開銷比較大,所以會(huì)導(dǎo)致性能的下降!
??結(jié)論:結(jié)構(gòu)體傳參的時(shí)候,要傳結(jié)構(gòu)體的地址!
好啦,關(guān)于結(jié)構(gòu)體的知識(shí)點(diǎn)到這里就結(jié)束啦,后期會(huì)繼續(xù)更新C語(yǔ)言的相關(guān)知識(shí),歡迎大家持續(xù)關(guān)注、點(diǎn)贊和評(píng)論!??????