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