在程序中, 常需要為結構動態分配內存, 這需要指向結構類型的指針. 當一個指針變量指向一個結構便稱為結構指針變量. 和普通指針類似, 可採用如下聲明一個結構指針:
結構名 *指針變量名;
如果要訪問結構中的成員變量, 在結構指針可以用下列表達:
Ps. 運算符 "*" 的優先權低於運算符 "." , 所以要對 *p 加括號, 才能使上式等價於 "stu1.name;" .
結構指針和普通指針占用同樣個數的內存單位, 其中存儲的仍是某個內存單元地址. 請視下列代碼:
sz 是數組名指針, 代表整個數組結構的首地址. 因此可以用結構指針 p 賦值. p 便指向結構數組 sz, 即指向了數組中下標為0的元素. 可以用(*p).name, (*p).age等 對下標為0的元素進行訪問, 而p+1 則指向下標為1的元素, 可以用(*(p+1)).name等進行訪問.
Ps. 結構指針運算數仍遵循一般指針運算. 並且C++不進行越界檢查. 故(*(p+99)).name這樣的用法存在錯
誤, 但編譯器不會識別.
範例代碼:
Ps. 由上述代碼看出 (*(p+2))與p[2]是等價的.
另外C++提供一種結構指針訪問結構成員的運算符 "->".
範例代碼:
結構名 *指針變量名;
如果要訪問結構中的成員變量, 在結構指針可以用下列表達:
- student stu1;
- student* p=&stu1;
- (*p).name;
Ps. 運算符 "*" 的優先權低於運算符 "." , 所以要對 *p 加括號, 才能使上式等價於 "stu1.name;" .
結構指針和普通指針占用同樣個數的內存單位, 其中存儲的仍是某個內存單元地址. 請視下列代碼:
- student sz[10];
- student* p=sz;
sz 是數組名指針, 代表整個數組結構的首地址. 因此可以用結構指針 p 賦值. p 便指向結構數組 sz, 即指向了數組中下標為0的元素. 可以用(*p).name, (*p).age等 對下標為0的元素進行訪問, 而p+1 則指向下標為1的元素, 可以用(*(p+1)).name等進行訪問.
Ps. 結構指針運算數仍遵循一般指針運算. 並且C++不進行越界檢查. 故(*(p+99)).name這樣的用法存在錯
誤, 但編譯器不會識別.
範例代碼:
- struct student{
- char name[20];
- int age;
- float weight;
- };
- /*
- * @ 結構指針動態分配內存 (P105)
- */
- void example506(){
- student* p = new student[5];
- cout << "請依序輸入第三個學生的姓名,年齡與體重" << endl;
- cin >> (*(p+2)).name >> (*(p+2)).age >> (*(p+2)).weight ;
- cout << "姓名: " << p[2].name << ", 年齡: " << p[2].age << ", 體重: " << p[2].weight << endl;
- delete[] p;
- }
Ps. 由上述代碼看出 (*(p+2))與p[2]是等價的.
另外C++提供一種結構指針訪問結構成員的運算符 "->".
範例代碼:
- struct student{
- char name[20];
- int age;
- float weight;
- };
- /*
- * @ 使用指針訪問結構成員 (P105)
- * C++提供一種結構類型指針訪問結構成員的方法, 就是使用運算符 "->"
- */
- void example507(){
- student stu2;
- stu2.age = 22;
- strcpy(stu2.name,"Peter");
- stu2.weight = 12;
- student* p2 = &stu2;
- cout << "姓名: " << stu2.name << ", 年齡: " << stu2.age << ", 體重: " << stu2.weight << endl;
- cout << "姓名: " << (*p2).name << ", 年齡: " << (*p2).age << ", 體重: " << (*p2).weight << endl;
- cout << "姓名: " << p2->name << ", 年齡: " << p2->age << ", 體重: " << p2->weight << endl;
- }
This message was edited 2 times. Last update was at 13/05/2010 15:41:15
沒有留言:
張貼留言