论述

主函数中的构造体变量作为非主函数的参数时,若只是将构造体变量名传与非主函数, 那就意味着仅是将其值传递给了非主函数外部,相当于在非主函数外部复制粘贴了一个新的构造体(此处称之为X),这个新构造体X与主函数中的构造体(此处称之为Y)是互相独立的,但它们二者的初始成员值都雷同.

struct SSS{    ...};void NonMain(SSS X){    // X & Y的初始成员值都雷同, 地址却相异    ...}int mian(){    SSS Y;    NonMain(Y);    return 0;}

根据上述代码,如果在NonMain函数中扭转了构造体变量外部的值,当NonMain函数运行完结后,程序返回主函数时,主函数中原有的构造体变量外部不会有丝毫变动.
这是因为构造体变量名自身不是地址, 非主函数内所操作的构造体变量的地址,并非主函数中的构造体变量的地址.

因而,正确的构造体变量传参加非主函数时,须要先取出构造体变量的地址当作指针,再将指针传与非主函数.

代码示例

#include <string>#include <cstring>#include <iostream>#include <queue>using namespace std;typedef struct TimesRecord{        int year;        int month;        int day;} times;void initializationError(TimesRecord date_record){        date_record.year = 2015;        date_record.month = 5;        date_record.day = 18;        cout << "initializationError.&date_record: " << &date_record << endl;}void alterError(TimesRecord date_record, int newYear, int newMonth, int newDay){        date_record.year = newYear;        date_record.month = newMonth;        date_record.day = newDay;        cout << "alterError.&date_record: " << &date_record << endl;}/* ----------------------------------------------------------------------------- */void initializationCorrect(TimesRecord &date_record){        date_record.year = 2015;        date_record.month = 5;        date_record.day = 18;        cout << "initializationCorrect.&date_record: " << &date_record << endl;}void alterCorrect(TimesRecord &date_record, int newYear, int newMonth, int newDay){        date_record.year = newYear;        date_record.month = newMonth;        date_record.day = newDay;        cout << "alterCorrect.&date_record: " << &date_record << endl;}int main(int argc, char const *argv[]){        TimesRecord t;        int newYear = 2006;        int newMonth = 9;        int newDay = 22;        initializationError(t);        cout << "Error initialization: ";        cout << t.year << "-" << t.month << "-" << t.day << endl;        cout << "main.&t: " << &t << endl;        cout << endl;        alterError(t, newYear, newMonth, newDay);        cout << "Error Alter: ";        cout << t.year << "-" << t.month << "-" << t.day << endl;        cout << "main.&t: " << &t << endl;        cout << endl;        initializationCorrect(t);        cout << "Correct initialization: ";        cout << t.year << "-" << t.month << "-" << t.day << endl;        cout << "main.&t: " << &t << endl;        cout << endl;        alterCorrect(t, newYear, newMonth, newDay);        cout << "Correct Alter: ";        cout << t.year << "-" << t.month << "-" << t.day << endl;        cout << "main.&t: " << &t << endl;        return 0;}




运行后果

initializationError.&date_record: 0x7ffc498004b0Error initialization: -5234528-22046-1233126896main.&t: 0x7ffc498004e8alterError.&date_record: 0x7ffc498004b0Error Alter: -5234528-22046-1233126896main.&t: 0x7ffc498004e8initializationCorrect.&date_record: 0x7ffc498004e8Correct initialization: 2015-5-18main.&t: 0x7ffc498004e8alterCorrect.&date_record: 0x7ffc498004e8Correct Alter: 2006-9-22main.&t: 0x7ffc498004e8