最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度剖析C語言結(jié)構(gòu)體

 更新時間:2018年12月19日 09:36:40   作者:Engineer-Bruce_Yang  
今天小編就為大家分享一篇關(guān)于深度剖析C語言結(jié)構(gòu)體,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

做了挺久的開發(fā),對于C這種東西,我不敢說自己已經(jīng)精通了,畢竟還是有許多細(xì)節(jié)在學(xué)習(xí)的過程中會遺忘,然后再通過實踐慢慢去一點點撿回來。所以只能算是熟練級別。

Linux內(nèi)核的實現(xiàn)博大精深,從offsetof的實現(xiàn)到后面的container_of,為什么通過結(jié)構(gòu)體的的成員就能獲得整個結(jié)構(gòu)體的指針呢?這就得益于offsetof宏的實現(xiàn)。關(guān)于這個宏,前面的博文也有講解,但不夠深入,今天的這個例子,足以對結(jié)構(gòu)體本身的原理大徹大悟,我們來看下面這個例子:

#include <stdio.h>
//32位系統(tǒng)上,結(jié)構(gòu)體在沒指定對齊的時候,默認(rèn)以四字節(jié)進(jìn)行對齊 
typedef struct __ST
{
 int id ;  //4
 char *name ; //4
 float math ; //4
}ST;
int main()
{
 ST st ;
 //獲取結(jié)構(gòu)體的第一個元素的首地址 
 int *ptr_0 = (int *)(&st);
 printf("st:  %p  ptr:  %p \n",&st,ptr_0);
 //對結(jié)構(gòu)體第一個元素賦值 
 *ptr_0 = 100 ;
 printf("*ptr_0 = %d\n",*ptr_0);
 //獲取結(jié)構(gòu)體的第二個元素的首地址,因為第二個元素是一級指針,所以需要用一個二級指針來接 
 char **ptr_1 = (char **)((int)&st+4) ;
 printf("ptr_1:%p\n",ptr_1);
 //對結(jié)構(gòu)體的第二個元素賦值 
 *ptr_1 = "hello world";
 printf("ptr_1:%s\n",*ptr_1);
 //獲取結(jié)構(gòu)體的第三個元素的首地址,根據(jù)對齊原則偏移算出第三個元素的地址 
 float *ptr_2 = (float *)((int)&st+8) ;
 printf("ptr_2:%p \n",ptr_2);
 //對結(jié)構(gòu)體的第三個元素進(jìn)行賦值 
 *ptr_2 = 96.78 ;
 printf("ptr_2:%.2f \n",*ptr_2);
 //輸出結(jié)構(gòu)體中所有成員的值 
 printf("st.id = %d  st.name = %s  st.math = %.2f\n",st.id,st.name,st.math);
  return 0;
}

這里的根據(jù)對齊原則算出來的偏移量其實其實不就是offsetof宏的原理嗎?

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

往后繼續(xù)看待鏈表,函數(shù)指針,等等與結(jié)構(gòu)體有關(guān)的概念,瞬間覺得一幕了然,徹底打通了這條曾經(jīng)學(xué)習(xí)的阻塞道路。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • 快速學(xué)習(xí)六大排序算法

    快速學(xué)習(xí)六大排序算法

    這篇文章主要介紹了六大排序算法-插入排序、希爾排序、選擇排序、冒泡排序、堆排序、快速排序,需要學(xué)習(xí)的小伙伴可以參考這篇文章
    2021-08-08
  • C++如何有效地利用命名空間

    C++如何有效地利用命名空間

    談到C++編程中的模塊化和組織性時,命名空間(Namespace)是一個重要的概念,所以本文主要來和大家聊聊C++命名空間的概念、用法以及如何有效地利用它來管理代碼,有需要的可以參考下
    2023-09-09
  • C++進(jìn)化后的const變量實例探究

    C++進(jìn)化后的const變量實例探究

    這篇文章主要為大家介紹了C++進(jìn)化后的const變量實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 基于Qt制作一個定時關(guān)機的小程序

    基于Qt制作一個定時關(guān)機的小程序

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt制作一個有趣的定時關(guān)機的小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 如何通過C++在Bing搜索引擎上進(jìn)行命令行搜索

    如何通過C++在Bing搜索引擎上進(jìn)行命令行搜索

    這篇文章主要介紹了通過C++在Bing搜索引擎上進(jìn)行命令行搜索,在這篇文章中,我們將介紹一個簡單的C++程序,允許用戶通過命令行輸入搜索詞,在Bing搜索引擎上執(zhí)行搜索,并在默認(rèn)瀏覽器中顯示搜索結(jié)果,需要的朋友可以參考下
    2023-12-12
  • C語言掃雷游戲的實現(xiàn)代碼

    C語言掃雷游戲的實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C語言掃雷游戲?qū)崿F(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 解析C++中std::ref的使用

    解析C++中std::ref的使用

    這篇文章主要介紹了解析C++中std::ref的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言實現(xiàn)簡單員工工資管理系統(tǒng)

    C語言實現(xiàn)簡單員工工資管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 關(guān)于VS+QT5應(yīng)用程序換圖標(biāo)的解決方案

    關(guān)于VS+QT5應(yīng)用程序換圖標(biāo)的解決方案

    這篇文章主要介紹了VS+QT5應(yīng)用程序換圖標(biāo)的處理方案,本文給大家提供了兩種解決方案供大家參考,每種方法給大家講解的都非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • C++調(diào)用C#的DLL實現(xiàn)方法

    C++調(diào)用C#的DLL實現(xiàn)方法

    這篇文章主要介紹了C++調(diào)用C#的DLL實現(xiàn)方法,很有實用價值,需要的朋友可以參考下
    2014-07-07

最新評論

叙永县| 长宁县| 张家界市| 固镇县| 兰考县| 河南省| 安陆市| 古浪县| 瑞金市| 紫金县| 彝良县| 墨脱县| 吴堡县| 应城市| 山东| 揭阳市| 大悟县| 买车| 越西县| 天祝| 文成县| 循化| 陈巴尔虎旗| 吐鲁番市| 阜新| 香河县| 拜城县| 甘洛县| 北流市| 伊金霍洛旗| 大同市| 泽库县| 双流县| 西安市| 芜湖县| 盈江县| 桃园市| 建宁县| 广安市| 贵德县| 衡东县|