結構體數組與指針

struct Student //定義的結構體類型 相當於int 、float這些類型 ,是用戶自定義的
{
    char name[20];
    int num;
    float score;


}s[5] = { { "nijiushidiao", 1, 99 }, { "nijiuqua",2, 89 } }, *p = s; /* s[5]、*p這些是這種類型的變量名,
他在函數體外面所以相當於全局變量,如果在此分號前沒有定義變量那麼他僅僅就是用戶定義的的類型,不爲他分配
內存空間,如:
struct student 
{
    int num;
    char name[20];
};系統就不會給他分配內存空間*/

int main()
{
    printf("1 %f\n",p->score);/*打印99.000,相當於(*p).score,p存的是s結構體數組的首元素的地址,這個元素
    包括第一個學生的所有信息(name,num,score),因此*p使進入結構體,此時*p不像二維數組那樣還是地址,還可以
    做*(*p+1)這樣的運算,因爲結構體裏面的數據類型不一致,加一不知道加到哪,所以在結構體裏面*p就是進入
    結構體並且看到了第一個學生的所有信息並且通過.score將該學生的某一項信息打印出來*/
    printf("2 %d\n", *s);//打印一個奇怪的數字,具體這個數字怎麼來的有待研究,理解方法同上
    printf("3 %d\n",sizeof( s));//打印140,在sizeof下s代表整個結構體數組的大小
    printf("4 %d\n",sizeof(s[0]));//打印28,第一個學生s[0]的大小
    printf("5 %d\n", s);//打印18644992,首元素(包括第一個學生所有信息)的地址
    printf("6 %d\n", s+1);//打印18645020=18644992+28,加一加到下一個學生s[1]的地址
    printf("7 %d\n", &s);//打印18644992,代表整個結構體數組的地址加一就跳過所有學生,就到s[5]的下一個
    printf("8 %d\n", &s + 1);// 打印18645132=18644992+140
    printf("9 %d\n", &(p->name));//打印18644992,代表首位學生的name的地址,雖然值都一樣但意義不一樣
    struct Student tmp = s[0];
    *p = s[1];
    s[1] = tmp;
    printf("%s--%d\n", p->name, p->num);//打印第二個學生的學號與姓名
    printf("%s--%d\n",(p+1)->name,(p+1)->num);//第一個學生,代表在結構體裏面可以將整個學生信息一次性交換,而一般數組則不行
    getchar();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章