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