c語言聲明變量時會分配空間嗎,成員變量隱藏c語言,C語言中隱藏結構體的細節

 2023-10-05 阅读 19 评论 0

摘要:我們都知道,在C語言中,結構體中的字段都是可以訪問的。或者說,在C++ 中,類和結構體的主要區別就是類中成員變量默認為private,而結構體中默認為public。結構體的這一個特性,導致結構體中封裝的數據,實際上并沒有封裝

我們都知道,在C語言中,結構體中的字段都是可以訪問的。或者說,在C++ 中,類和結構體的主要區別就是類中成員變量默認為private,而結構體中默認為public。結構體的這一個特性,導致結構體中封裝的數據,實際上并沒有封裝,外界都可以訪問結構體重的字段。

C++中我們尚可用類來替代結構體,但是,C語言中是沒有類的,只能用結構體,但很多時候,我們需要隱藏結構體的字段,不讓外界直接訪問,而是通過我們寫的函數進行間接訪問,這樣就提高了程序的封裝性。

實現方法,簡單來說,就是,結構體定義時,要定義在.c文件中,然后我們自己定義一些訪問結構體的函數,在.h文件中,只存放函數原型聲明和對結構體的聲明。

看個例子

.c文件中

c語言聲明變量時會分配空間嗎、//stu.c

#include

#include

#include

struct stu{

char id[10];

c++隱藏,int score;

};

struct stu *new_stu()

{

struct stu *s;

s = (struct stu *)malloc(sizeof(struct stu));

c++局部變量和全局變量存放在哪里?return s;

}

void set_id(struct stu *s,char *id)

{

strcpy(s->id,id);

}

c語言結構類型和結構變量?char *get_id(struct stu *s)

{

return s->id;

}

可以看到,在.c文件中,我定義了一個結構體,并且定義了一些用于操作這個結構體的函數。

在.h文件中

c語言結構體怎么使用、stu.h

#ifndef STU_H

#define STU_H

struct stu;

extern void set_id(struct stu *s,char *id);

extern char *get_id(struct stu *s);

c語言成員變量是什么,extern struct stu *new_stu();

#endif

在.h中我聲明了一下結構體struct stu,并且寫了函數的原型聲明,供其他文件調用。

在main.c中我引用了stu.h

下面是main.c

#include

c語言訪問結構體成員、#include "stu.h"

int main()

{

//struct stu s;

//s.score = 100;

//struct stu s = {{0}};

結構體變量賦值。struct stu *s;

s = new_stu();

set_id(s, "950621");

char *id = NULL;

id = get_id(s);

printf("設置的id為:%s\n",id);

c語言數組里可以放變量名么。return 0;

}

可以看到,在main函數中,我先是定義了一個struct stu類型的指針,然后通過new_stu()給這個指針分配了空間,在通過另外兩個函數對其進行了操作。

這里需要注意一下我注釋掉的部分,說明一下:

這種情況下,不能定義struct stu類型的變量!!!

因為:

結構體變量成員的引用方式是使用。.h文件中,只是對結構體進行了聲明,并沒有結構體具體細節的描述,也就是在main.c中只是聲明了一下struct stu,這樣編譯器就知道有個結構體類型叫struct stu,但是它并不知道stu的內部細節。

我們都知道,定義一個變量,編譯器是要給它分配內存空間的,但是,此時編譯器并不知道stu的內部細節,也就不知道stu這個結構體的變量要占多少空間,自然無法分配內存。這樣在編譯時期就會報錯。

但是定義一個指針變量就不一樣啦,不管是什么類型的指針,占據的內存空間都是4個字節,編譯器只需要確定有個叫struct stu 的類型存在就好了,而.h中那個聲明,就是在告訴編譯器,有這么一個類型。

同時,這種情況下也不能訪問結構體的字段,比如,s->score=100;這條語句在編譯時就會報錯,原因和上面一樣,編譯器并不知道struct stu結構體的內部細節。

通過上面的方法,在除了stu.c文件之外的其他文件中,只能通過stu.c中定義的函數來間接操作結構體變量,而不能直接對結構體變量進行操作,包括不能創建一個結構體變量!

這樣就很好地體現了程序的封裝性,也提高了程序的安全性。但是就需要我們寫很多操作函數啦,包括創建結構體指針變量分配空間的函數。

c語言局部變量和全局變量的區別、我們也可以在.h文件中用typedef聲明一個結構體的指針類型,如? typedef struct sut * pStu;

這樣在main.c中就可以用pStu聲明結構體指針變量了。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/114801.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息