java 結構體數組初始化_C數組結構體聯合體快速初始化

背景

C89標準規定初始化語句的元素以固定順序出現,該順序即待初始化數組或結構體元素的定義順序。

C99標準新增指定初始化(Designated Initializer),即可按照任意順序對數組某些元素或結構體某些成員進行選擇性初始化,只需指明它們所對應的數組下標或結構體成員名。GNU C將其作為C89模式的擴展。

借助指定初始化特性,可實現數組或結構體元素的快速初始化。

1數組初始化

在數組初始化列表中使用“[index常量表達式]=value”形式可對index所指定的某個元素進行初始化。如:

int arr[6] = { [0]=5, [1]=6, [3] =10, [4]=11 }; 或

int arr[6] = { [0]=5, 6, [3] =10, 11 }; 或

int arr[6] = { [3] =10, 11, [0]=5, 6 }; (指定順序可變)

均等效于:int arr[6] = {5, 6, 0, 10, 11, 0};

說明:

1) 若在某個指定初始化項目后跟有不至一個值,如[3]=10,11。則多出的數值用于對后續的數組元素進行初始化,即數值11用來初始化arr[4]。

2) C數組初始化一個或多個元素后,未初始化的元素將被自動地初始化為0或NULL(針對指針變量)。未經過任何初始化的數組,所有元素的值都是不確定的。

當下標是字符或屬于枚舉類型時,標識數組初始化語句的元素特別有用。如:

int whitespace[256] = {

[' '] = 1, ['\t'] = 1, ['\h'] = 1,

['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };

static const char* gMsgName[] = {

[MSG_CREATE] = "Create",

[MSG_DELETE] = "Delete",

[MSG_SET]??? = "Set",

[MSG_GET]??? = "Get",

[MSG_GET_ALARMS] = "GetAlarms",

[MSG_SET_TABLE]? = "SetTable"}; //枚舉值變化時,數組自動同步更新

這種初始化方式可實現簡化的映射表,不過在下標指示符跨度較大時稍顯浪費內存。

GNU C還支持”[first … last]=value”(…兩側有空格)的形式,將該范圍內的若干元素初始化為相同值。如:

int arr[]={ [0 ... 3]=1, [4 ... 5]=2, [6 ... 9] =3}; 或

int arr[]={ [0 ... 3]=1, [4 ... 5]=2, [6 ... 8] =3, [9] =3};

均等效于:int arr[10] = {1, 1, 1, 1, 2, 2, 3, 3, 3, 3};

注意,數組長度為指定的最大下標值加1。

這種初始化方式比memset高效且用途更廣,如:

int arr[]={ [0 ... 127]=-1 };

等效于:memset(arr, 0xFF, sizeof(arr));

int arr[]={ [0 ... 127]=1 };

不等效于:memset(arr, 1, sizeof(arr));

2結構體初始化

結構的指定初始化語法與數組類似,只不過使用點運算符和成員名(而不是方括號和索引值)標識具體的元素。例如,對于結構體

struct Structure{?int a;?int b; };或struct Structure{ int a, b; };

有以下幾種初始化方式:

struct Structure tStct = {

.a = 1,

.b = 2

};

用“.fieldname=”指定待初始化成員名(成員初始化順序可變)

struct Structure tStct = {

a : 1,

b : 2

};

用“fieldname:”指定待初始化成員名(成員初始化順序可變)

GCC 2.5已廢除,但仍接受

struct Structure tStct = { 1, 2};

內核結構體多采用第一種初始化方式,如Linux-2.6.x/drivers/usb/storage/usb.c設備驅動程序中:

static struct usb_driver usb_storage_driver = {

.owner = THIS_MODULE,

.name = "usb-storage",

.probe = storage_probe,

.disconnect = storage_disconnect,

.id_table = storage_usb_ids,

};

該方式初始化時不必嚴格按照定義時的順序,靈活性很高。

【例】定義如下結構體

struct book{

char title[MAXTITL];

char author[MAXAUTL];

float value;

int mask[128];

};

可按照任意順序使用指定初始化項目:

struct book gift = { .value = 25.99,

.author = "James Broadfool",

.title = "Rue for the Toad",

.mask[0 ... 127] = -1};

也可只初始化結構體成員value:

struct book surprise = { .value = 10.99 };

正如數組一樣,跟在指定初始化項目后且沒有指示符(“[index]”或“fieldname”)的常規初始化項目為跟在指定成員后定義的下個成員提供初始值。此外,若對特定成員初始化多次,則最后一次賦值是它實際獲得的值。

考慮下列聲明:

struct book gift = { .value = 18.90,

.author = "Philionna pestle",

0.25};

將把值0.25賦給成員value,因為它在結構體定義中緊跟在author成員之后。新值0.25覆蓋前值18.90。

若覆蓋初始化有副作用(如類型不兼容),則GNU C可能會產生編譯警告。

利用指定初始化特性,可方便地編寫如下的測試例程:

AGENT_PW_PSN tPwPsn = {

.dwSlotNo = 2,

.dwPortNo = dwPortNo,

.dwPsnType = TRANS_MPLS,

.dwInBndLable = dwInBndLable,

.dwOutBndLable = dwOutBndLable,

.dwMplsType = MPLS_SINGLE_LABELLED,

.dwInBndTunnelLable = 0,

.dwOutBndTunnelLable = 0,

.aucDstMac = {0x00,0x15,0xeb,0x72,0x00,0x0e},

.dwVlanId = 300,

.dwPriority = 7

};

OmciSetPwPsn(&tPwPsn, sizeof(tPwPsn), aucBufOut, &dwOutLen);

3聯合體初始化

可用“.fieldname” (或已廢棄的“fieldname:”)指示符來指定使用聯合體的哪個元素,如:

union UnionT { int i; double d; };

union UnionT tUnion = { .d = 4 };

使用第二個元素將4轉換為double類型存入聯合體。相反,將4轉換為union UnionT類型則會把它作為整數i存入聯合體。

4結構體數組初始化

可在“=”前寫上一系列的“[index]”和“.fieldname”指示符來指定待初始化的嵌套子對象,如:

struct Structure ptStct[10] = {

[2].b = 0x2B, [2].a = 0x2A,

[0].a = 0x0A };

5 GCC擴展結構體賦值

對于上文定義的結構體Structure可整體賦值:

struct Structure tStct1, tStct2;

tStct2 = tStct1;

結構體也可作為函數返回值對另一個結構體賦值:

struct Structure func1();

struct Structure tStct = func1();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533054.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533054.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java override 訪問權限_java基礎之——訪問修飾符(private/default/protected/public)

1. 訪問修飾符介紹java中的訪問修飾符包含了四種:private、default(沒有對應的保留字)、protected和public。它們的含義如下:private:如果一個元素聲明為private,那么只有同一個類下的元素才可以訪問它。default:如果一…

python中scrapy可以爬取多少數據_python中scrapy框架爬取攜程景點數據

———————————————————————————————[版權申明:本文系作者原創,轉載請注明出處]文章出處:https://blog.csdn.net/sdksdk0/article/details/82381198作者:朱培 ID:sdksdk0——————…

python灰色關聯度分析代碼_灰色關聯分析法步驟 - osc_uwnmtz9n的個人空間 - OSCHINA - 中文開源技術交流社區...

https://wenku.baidu.com/view/dc356290af1ffc4fff47ac0d.html?rec_flagdefault&sxts1538121950212利用灰色關聯分析的步驟是:1.根據分析目的確定分析指標體系,收集分析數據。設n個數據序列形成如下矩陣:其中m為指標的個數&a…

aio 系統原理 Java_Java新一代網絡編程模型AIO原理及Linux系統AIO介紹

從JDK 7版本開始,Java新加入的文件和網絡io特性稱為nio2(new io 2, 因為jdk1.4中已經有過一個nio了),包含了眾多性能和功能上的改進,其中最重要的部分,就是對異步io的支持,稱為Java AIO(asynchronous IO)。因為AIO的實…

centos mysql 5.5 art_Linux?CentOS6.5下編譯安裝MySQL?5.5.51''''

一、編譯安裝MySQL前的準備工作安裝編譯源碼所需的工具和庫yum install gcc gcc-c ncurses-devel perl安裝cmake,從http://www.cmake.org下載源碼并編譯安裝wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gztar -xzvf cmake-2.8.10.2.tar.gzcd cmake-2.…

java修改默認字符編碼_設置默認的Java字符編碼?

如何以編程方式正確設置JVM(1.5.x)使用??的默認字符編碼?我已經讀過-Dfile.encoding 以前是以往的方式去為舊的JVM …我沒有那么奢侈的原因,我不會進入。我努力了:System.setProperty("file.encoding", "UTF-8");并且屬…

java api 第一個類是_JAVA常用API:String 類的常用方法

字符串是一個對象,有很多方法可以使用1. length();返回字符串的長度String str "abcd";int len str.length();2. isEmpty(); 僅當當length()為0時返回true,否則返回falseboolean b str.isEmpty();3. getBytes();返回字符串中每個字符的ASCII碼(使用平臺…

關于java內容_關于java一些概念性的內容

PO:persistant object持久對象最形象的理解就是一個PO就是數據庫中的一條記錄。好處是可以把一條記錄作為一個對象處理,可以方便的轉為其它對象。--------------------------------------------------------------------------------BO:busin…

java訂單類_基于Java創建一個訂單類代碼實例

這篇文章主要介紹了基于Java創建一個訂單類代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下需求描述定義一個類,描述訂單信息訂單id訂單所屬用戶(用戶對象)訂單所包含的商品(不定數量個商品對…

java請假審批怎么實現_java實現請假時間判斷

筆記:需求分析:每周上班6天夏季早上8:30-12:00下午14:00-17:30冬季早上8:30-12:00下午14:30-18:00請假最低為半天按照上午8:00-12:00,下午14:00-18:00計算,包括了夏季和冬季時間,規律分布如下public String getDouble(HttpServletRequest request) throws ParseException {//參…

mariadb mysql 5.6_MySQL / MariaDB 5.5 升級到 MySQL 5.6

RHEL 及 CentOS 7 默認的資庫系統是 MariaDB 5.5 (等同 MySQL 5.5), 雖然現時 MySQL 最新版是 5.7, 但一般上升級都建議一級一級上, 而 MySQL 5.6 比 5.5 也提高了效能及提供更多功能, 以下是在 RHEL 及 CentOS 從原來的 MySQL 5.5 或 MariaDB 5.5, 升級到 MySQL 5.6 的步驟。1…

iText報表Java_(例)Java生成PDF報表 iText

// 導入IO庫類import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;// 導入 PO&#x…

mysql update修改數據_MySQL UPDATE:修改數據(更新數據)

在 MySQL 中,可以使用 UPDATE 語句來修改、更新一個或多個表的數據。UPDATE 語句的基本語法使用 UPDATE 語句修改單個表,語法格式為:UPDATE SET 字段 1值 1 [,字段 2值 2… ] [WHERE 子句 ][ORDER BY 子句] [LIMIT 子句]語法說明如下&#xf…

java堆內存 數據結構_JAVA內存區域

首先解釋下內存溢出和內存泄露之間的區別,為后面的學習做些鋪墊:1、內存溢出和內存泄露的區別和聯系內存溢出 out of memory:是指程序申請內存時,沒有足夠的內存供申請者使用,或者說,給了你一塊存儲int類型…

java jsp的指令_[javaEE] jsp的指令

jsp的指令:jsp的指令(directive)是為jsp引擎而設計的,他們并不直接產生任何可見輸出,而是告訴引擎如何處理jsp頁面中的其他部分頁面頭部的page指令pageEncoding"utf-8"%>配置錯誤頁面:web.xml500/500.jsp404/404.jsp…

JAVA不能滿屏_java – 全屏幕視頻,不拉伸視頻

像這樣,你可以自己設置視頻的屬性。使用SurfaceView(給你更多的視圖控制),將其設置為fill_parent以匹配整個屏幕android:orientation"vertical"android:layout_width"match_parent"android:layout_height"fill_parent">…

java異常標記_java.lang.RuntimeException:錯誤:0D0680A8:asn1編碼例程:ASN1_CHECK_TLEN:錯誤的標記...

我收到此錯誤(在標題中).我不確定為什么,請幫忙.代碼如下:public static String decryptRSA(Context mContext, byte[] message) throws Exception {InputStream in mContext.getResources().openRawResource(R.raw.publicrsakey);X509EncodedKeySpec x509EncodedK…

正版我的世界怎么下載java_mcjava正版下載-mc我的世界java安卓正式版極速下載v1.0.1 - 趣趣手游網...

mc我的世界java安卓正式版帶你體驗最為精彩的多人聯機對戰玩法,游戲專為java系列打造,在游戲的部分特性上有著各種的提升,以及各種專屬的表達,比基巖版能多一些不同的玩法,在這里有著各種不同的玩法以及模式等待你的加…

java原子整數_多線程(四、原子類-AtomicInteger)

案例10個線程并發累加一個整數,每個線程累加1000,保證線程安全Unsafe類,來源于sun.misc包。該類封裝了許多類似指針操作,可以直接進行內存管理、操縱對象、阻塞/喚醒線程等操作。package com.jane;import java.util.ArrayList;imp…

java 新建菜單選項_請完成下列Java程序:創建一個下拉式菜單,菜單項包括3個CheckboxM..._考試資料網...

請完成下列Java程序:創建一個下拉式菜單,菜單項包括3個CheckboxMenultem(復選框),一條分割線和一個Exit項。要求打開或關閉復選框時,確定是哪個被切換,是開還是關,并輸出它的狀態;選擇Exit項能夠…