2010年11月11日 星期四

[C++ 小學堂] 結構, 共用體與鏈表 : 指向結構的指針


在程序中, 常需要為結構動態分配內存, 這需要指向結構類型的指針. 當一個指針變量指向一個結構便稱為結構指針變量. 和普通指針類似, 可採用如下聲明一個結構指針:
結構名 *指針變量名;

如果要訪問結構中的成員變量, 在結構指針可以用下列表達:
  1. student stu1;  
  2. student* p=&stu1;  
  3. (*p).name;  

Ps. 運算符 "*" 的優先權低於運算符 "." , 所以要對 *p 加括號, 才能使上式等價於 "stu1.name;" .

結構指針和普通指針占用同樣個數的內存單位, 其中存儲的仍是某個內存單元地址. 請視下列代碼:
  1. student sz[10];  
  2. student* p=sz;  

sz 是數組名指針, 代表整個數組結構的首地址. 因此可以用結構指針 p 賦值. p 便指向結構數組 sz, 即指向了數組中下標為0的元素. 可以用(*p).name, (*p).age等 對下標為0的元素進行訪問, 而p+1 則指向下標為1的元素, 可以用(*(p+1)).name等進行訪問.
Ps. 結構指針運算數仍遵循一般指針運算. 並且C++不進行越界檢查. 故(*(p+99)).name這樣的用法存在錯
誤, 但編譯器不會識別.
範例代碼:
  1. struct student{  
  2.     char name[20];  
  3.     int age;  
  4.     float weight;  
  5. };  
  6. /* 
  7.   * @ 結構指針動態分配內存 (P105) 
  8.   */  
  9. void example506(){  
  10.     student* p = new student[5];  
  11.     cout << "請依序輸入第三個學生的姓名,年齡與體重" << endl;  
  12.     cin >> (*(p+2)).name >> (*(p+2)).age >> (*(p+2)).weight ;  
  13.     cout << "姓名: " << p[2].name << ", 年齡: " << p[2].age << ", 體重: " <<  p[2].weight << endl;  
  14.   
  15.     delete[] p;  
  16. }  

Ps. 由上述代碼看出 (*(p+2))與p[2]是等價的.
另外C++提供一種結構指針訪問結構成員的運算符 "->".
範例代碼:
  1. struct student{  
  2.     char name[20];  
  3.     int age;  
  4.     float weight;  
  5. };  
  6. /* 
  7.   * @ 使用指針訪問結構成員 (P105) 
  8.   *   C++提供一種結構類型指針訪問結構成員的方法, 就是使用運算符 "->" 
  9.   */   
  10. void example507(){     
  11.     student stu2;  
  12.     stu2.age = 22;  
  13.     strcpy(stu2.name,"Peter");  
  14.     stu2.weight = 12;  
  15.     student* p2 = &stu2;  
  16.     cout << "姓名: " << stu2.name << ", 年齡: " << stu2.age << ", 體重: " <<  stu2.weight << endl;  
  17.     cout << "姓名: " << (*p2).name << ", 年齡: " << (*p2).age << ", 體重: " <<  (*p2).weight << endl;  
  18.     cout << "姓名: " << p2->name << ", 年齡: " << p2->age << ", 體重: " <<  p2->weight << endl;  
  19. }  
This message was edited 2 times. Last update was at 13/05/2010 15:41:15

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...