0
 #include <iostream>
 #include <cstring>
 using namespace std;

 struct Student {
     int no;
     char grade[14];
 };

 void set(struct Student* student);
 void display(struct Student student);

 int main( ) {
     struct Student harry = {975, "ABC"};

     set(&harry);
     display(harry);
 }
 void set(struct Student* student){
     struct Student jim = {306, "BBB"};

     *student = jim; // this works
     //*student.no = 306; // does not work
 }
 void display(struct Student student){

     cout << "Grades for " << student.no;
     cout << " : " << student.grade << endl;
 }

構造体の 1 つのメンバーだけをポインターで変更するにはどうすればよいですか? *student.no = 306 が機能しないのはなぜですか? 少し混乱しています。

4

3 に答える 3

3

構造体へのポインターがある場合は、その->メンバーにアクセスするために使用する必要があります。

student->no = 306;

これは を行うための構文糖衣です(*student).no = 306;。あなたがうまくいかなかった理由は、演算子の優先順位のためです。かっこがない場合、.は よりも優先*され、コードは と同等でした*(student.no) = 306;

于 2013-02-08T21:15:30.847 に答える
0

使用する必要があります

student->no = 36

とはいえ、構造体を値渡しで関数に渡すのは良い習慣ではありません。

// Use typedef it saves you from writing struct everywhere.
typedef struct {
     int no;
// use const char* insted of an array here.
     const char* grade;
 } Student;

 void set(Student* student);
 void display(Student* student);

 int main( ) {
     // Allocate dynmaic. 
     Student *harry = new Student;
      harry->no = 957;
      harry->grade = "ABC";

     set(harry);
     display(harry);
 }
 void set(Student *student){

     student->no = 306; 
 }
 void display(Student *student){

     cout << "Grades for " << student->no;
     cout << " : " << student->grade << endl;

     delete student;
 }
于 2013-02-08T21:55:25.067 に答える
0

operator*優先度が非常に低いため、括弧で評価を制御する必要があります。

(*student).no = 306;

それは常に次のように行うことができますが:

student->no = 306;

私の意見では、これははるかに簡単です。

于 2013-02-08T21:15:34.237 に答える