C++结构体中关于结构体变量,指针,地址之间的转换

来源:互联网 发布:淘宝服装店货源网站 编辑:程序博客网 时间:2024/06/15 05:29

程序目标是:通过结构体来实现顺序栈的动态创建。


有两段代码

出错代码:

using namespace std;#include <iostream>typedef struct{int *arr;int top;int size;int name;}//define struct pointer and struct classSeqStack, *pSeqStack;  //初始化pSeqStack Stack_Init(int n){SeqStack S;S.arr= new int[n];S.size = n;//stack is nullS.top = -1;//一个结构体变量的指针就是结构体变量所在内存的起始地址//换句话说&S(结构体变量的内存地址)可以用对应的结构体指针来存储return (&S);}//入栈,注意输入操作定义在函数外,让函数功能单一pSeqStack PushStack(int n, int num){pSeqStack s1=Stack_Init(n);//cout << s1->top << endl;//for (; s1->top < num-1; (s1->top)++)//此处是不是有一个缺陷:不管我是否赋予top初值,程序都可以执行for (int i = s1->top; i < num - 1; i++)cin >> s1->arr[i+1];s1->top = num - 1;//cout << s1->top << endl;return s1;}//出栈void OutStack(pSeqStack s2,int n, int inNum, int outNum){cout << s2->top << endl;if (inNum>outNum){for (int i = s2->top; i>= inNum - outNum; i--){//cout << s2->arr[s2->top] << " ";//cout << "sd" << endl;}}}void main(){pSeqStack s2 = PushStack(20, 8);OutStack(s2, 20, 8,3);system("pause");}

正确代码:

using namespace std;#include <iostream>typedef struct{int *arr;//栈顶标识位int top;//栈最大长度int size;//栈已有数据个数int stackNum;}//注意SeqStack不是结构体变量,而是一个类型,*pSeqStack是指向结构体变量的指针SeqStack, *pSeqStack;pSeqStack Stack_Init(int n){SeqStack S;S.arr = new int[n];//未放入数据S.stackNum = 0;S.size = n;//stack is nullS.top = -1;//一个结构体变量的指针就是结构体变量所在内存的起始地址//换句话说&S(结构体变量的内存地址)可以用对应的结构体指针来存储return (&S);}SeqStack PushStack(SeqStack sp,int num){//cout << sp.top << endl;//验证是否将sp数据传递进来。/*for (int i = sp.top+1; i <= num - 1; i++)cin>>sp.arr[i];     sp.top = num - 1;*/for (; sp.top < num - 1; sp.top++){cin >> sp.arr[sp.top + 1];}//记录放入数据个数sp.stackNum = num;cout << sp.top << endl;//输出的下标值是num-1return sp;}void OutStack(SeqStack sp,int outNum){if (sp.size>outNum){for (; sp.top >= sp.stackNum - outNum; sp.top--)cout << sp.arr[sp.top] << " ";}}void main(){SeqStack s1 = *Stack_Init(20);SeqStack s2=PushStack(s1, 8);OutStack(s2, 3);system("pause");}

首先:typedef struct
{
int *arr;
int top;
int size;
int name;
}
//define struct pointer and struct class

SeqStack, *pSeqStack;  中的SeqStack不是结构体变量,而是类型。

错误的原因是:在进行结构体传递(函数对结构体进行修改之后,又将其返回,再作为其他函数的参数进一步操作)时,传递的一直是一个地址,而没有用结构体指针进行存储。

即:pSeqStack s2 = PushStack(20, 8);
OutStack(s2, 20, 8,3);

SeqStack s1 = *Stack_Init(20);
SeqStack s2=PushStack(s1, 8);   是不同的。


结构体基础知识点:C/C++提供了指向结构体变量的运算符,p->num,表示p当前指向的结构体中的变量num。

阅读全文
0 0
原创粉丝点击