文章目錄
- 目錄
- 1. 結構體類型的聲明
- 1.1 結構的基礎知識
- 1.2 結構的聲明
- 1.3 結構成員的類型
- 1.4 結構體變量的定義和初始化
- 2. 結構體成員的訪問
- 3. 結構體傳參
目錄
- 結構體類型的聲明
- 結構體初始化
- 結構體成員訪問
- 結構體傳參
1. 結構體類型的聲明
1.1 結構的基礎知識
結構是一些值的集合,這些值稱為成員變量,結構的每個成員可以是不同類型的變量。
注:
數組: 一組相同類型元素的集合
結構體: 其實是一組不一定相同類型元素的集合
1.2 結構的聲明
//描述一個學生
//名字+年齡+性別//聲明結構體類型
struct Stu
{//成員變量,是用來描述結構體對象的相關屬性的char name[20];int age;char sex[5];//男 女 保密
}s2, s3, s4;//s2,s3,s4 就是結構體變量 - 全局變量typedef struct Stu
{//成員變量,是用來描述結構體對象的相關屬性的char name[20];int age;char sex[5];//男 女 保密
}Stu;int main()
{//int a = 10;struct Stu s1;//局部變量Stu s2;return 0;
}
注:
struct Stu
{//成員變量,是用來描述結構體對象的相關屬性的char name[20];int age;char sex[5];//男 女 保密
};int main()
{//int a = 10;struct Stu s1;//局部變量//Stu s2;//在C語言中,沒有對結構體類型typedef,struct關鍵字不能省略return 0;
}
1.3 結構成員的類型
結構的成員可以是標量、數組、指針,甚至是其他結構體。
struct S
{int a;char arr[5];int* p;
};struct B
{char ch[10];struct S s;double d;
};int main()
{return 0;
}
1.4 結構體變量的定義和初始化
struct S
{int a;char arr[5];int* p;
}s1 = {100, "bit", NULL};struct S s2 = {98, "hehe", NULL};struct B
{char ch[10];struct S s;double d;
};int main()
{struct S s3 = {.arr = "abc", .p = NULL, .a = 1};struct B sb = { "hello", {20, "qqq", NULL}, 3.14 };return 0;
}
2. 結構體成員的訪問
- 結構體變量訪問成員
#include <stdio.h>struct S
{int a;char arr[5];int* p;
}s1 = {100, "bit", NULL};struct S s2 = {98, "hehe", NULL};struct B
{char ch[10];struct S s;double d;
};int main()
{struct S s3 = {.arr = "abc", .p = NULL, .a = 1};printf("%d %s %p\n", s3.a, s3.arr, s3.p);//. 結構成員訪問操作符struct B sb = { "hello", {20, "qqq", NULL}, 3.14 };printf("%s %d %s %p %.2lf\n", sb.ch, sb.s.a, sb.s.arr, sb.s.p, sb.d);return 0;
}
- 結構體指針訪問指向變量的成員
以下代碼是有問題的:
#include <string.h>struct Stu
{char name[20];int age;
};void set_Stu(struct Stu t)
{t.age = 20;//t.name = "張三";//errstrcpy(t.name, "張三");//字符串拷貝
}void print_Stu(struct Stu t)
{printf("%s %d\n", t.name, t.age);
}int main()
{struct Stu s = { 0 };set_Stu(s);print_Stu(s);return 0;
}
正確代碼:
#include <string.h>struct Stu
{char name[20];int age;
};//void set_Stu(struct Stu* ps)
//{
// (*ps).age = 20;
// strcpy((*ps).name, "張三");//字符串拷貝
//}void set_Stu(struct Stu* ps)
{ps->age = 20;//結構體指針->結構體成員strcpy(ps->name, "張三");//字符串拷貝
}void print_Stu(struct Stu t)
{printf("%s %d\n", t.name, t.age);
}int main()
{struct Stu s = { 0 };set_Stu(&s);print_Stu(s);return 0;
}
3. 結構體傳參
#include <stdio.h>struct S
{int data[1000];int num;
};struct S s = {{1,2,3,4}, 1000};//結構體傳參
void print1(struct S s)
{printf("%d\n", s.num);
}//結構體地址傳參
void print2(struct S* ps)
{printf("%d\n", ps->num);
}int main()
{print1(s); //傳結構體print2(&s); //傳地址return 0;
}
上面的 print1 和 print2 函數哪個好些?
答案是:首選print2函數。
原因:
函數傳參的時候,參數是需要壓棧的。如果傳遞一個結構體對象的時候,結構體過大,參數壓棧的的系統開銷比較大,所以會導致性能的下降。
結論: 結構體傳參的時候,要傳結構體的地址。