單指標表示的隱式結構體陣列以及其成員訪問方式

2021-09-27 04:38:44 字數 1649 閱讀 4086

當我們看到乙個結構體指標的時候,不要下意識的覺得它只是指向某乙個結構體例項的位址,因為該位址的記憶體單元的值是不確定的,如果在該記憶體起始位置分配了多個單位結構體大小的記憶體空間,那麼該指標指向的位址也可以看做乙個結構體陣列。如下**所示:

/*!

* description: 單指標表示的隱式結構體陣列及其成員訪問方式

* date: 2019-9-17

* author: hooy

*/#include #include int main()

*atest,*tmp;

atest = (struct a*)malloc(sizeof(a) * 2);

// atest[0] = ;

// atest[1] = ;

*atest = ;

*(atest + 1) = ;

tmp = atest;

printf(">>> '.'access style 1:\n");

printf("  atest[0]:%d\n", atest[0].seq);

printf("  atest[1]:%d\n", atest[1].seq);

atest = tmp;

printf(">>> '.'access style 2:\n");

printf("  atest[0]:%d\n", (*atest++).seq);

printf("  atest[1]:%d\n", (*atest).seq);

atest = tmp;

printf(">>> '->'access style 1:\n");

printf("  atest[0]:%d\n", atest++->seq);

printf("  atest[1]:%d\n", atest->seq);

atest = tmp;

printf(">>> '->'access style 2:\n");

printf("  atest[0]:%d\n", atest->seq);

printf("  atest[1]:%d\n", ++atest->seq);

return 0;

}

我們宣告了乙個a型別的結構體指標atest,並在以atest指向的位址作為起始位址,分配了2個a型別大小的記憶體空間。可以通過陣列下標的方式atest[0]

=,或者

*號方式

*atest

=,對其分別賦值。然後通過'.'或者'->'方式訪問結構體陣列中單個結構體成員變數。

注意:因為atest為stuct a型別的指標,所以在對該指標進行算術運算時,會以stuct a的大小做為單位偏移量計算位址,atest+1的計算結果實際上是指向下乙個stuct a的起始位址,同理使用陣列下標表示的atest[1],其中的[1]也是按stuct a的大小為單位偏移量計算位址。所以,以下表示方法是等效的。

atest = &atest[0], atest+1 = &atest[1]

用該方法表示結構體陣列,有比較大的風險,比如,使用atest[3]或者將atest指標加2或者更大,會讓atest指向一片我們不清楚的記憶體區域,如果我們此時再對把atest指向的記憶體空間按照stuct a型別讀取或者修改,就會讀到無意義的結果,或者改變其它變數儲存的值,這是有風險的。使用的時候需要謹慎。

結構體陣列指向結構體變數的指標

一 結構體陣列的定義 struct student stu 3 陣列各元素在記憶體中連續存放 二 結構體陣列的初始化 struct student stu 3 struct student stu 輸入10個學生的姓名 學號和成績,將其中不及格者的姓名 學號和成績輸出 p163.17 struct ...

指向結構體陣列的指標

include include include using namespace std 定義一種型別 typedef struct moreandmore mam 建立結構體指標 mam creatstructarr int a cout subname p 輸入subname arr i subn...

指向結構體的指標陣列,應用

陣列指標跟指標陣列,差異看起來很小,結果卻千差萬別 陣列指標 struct param p 100 p 1 的結果是位址會增大 100個 sizeof struct param 這種常用來去對二維陣列進行位置的索引。指標陣列 struct param p 100 指標陣列的作用,大概是為了為了管理不...