函数参数的接收和传递的类型,包括指针,引用,值的区别
概念
1.SqStack S和SqStack *S的区别
在C语言中:
-
SqStack S声明了一个结构体变量(你提到的"对象"在C中称为结构体变量) -
SqStack *S声明了一个指向结构体的指针
2.参数接收类型,指针,引用,值
(1)值类型接收
void PrintStack(SqStack S1){//这里用S普通变量接收,实际是传递过来的S的拷贝值,与原S是内存中两个地址不同的变量。所以该函数对S->top--的操作不会改变实际栈的结构 while(S1->top != -1){ printf("%d ", S1->data[S1->top--]); } printf("\n"); } int main(){ SqStack S; PrintStack(S);// }
(2)接收为指针类型,所以传递的时指针变量S。
void PrintStack(SqStack *S1){//指针接收S,传递过来的S为指针变量 //必须用临时变量,因为代码模拟栈操作,所以打印函数时,不应该影响top指针的实际值,否则栈数据会弹出(top--时) int temp = S.top; while(S1->top != -1){ printf("%d ", S1->data[S1->tmp--]); } printf("\n"); } int main(){ SqStack *S;//声明一个结构体指针 PrintStack(S);//S为指针变量 }
(3)接收为引用类型&
void PrintStack(SqStack &S1) {//用引用进行接收,是传递来的S的完全拷贝,包括地址,值都一样,所以会改变原始值。 // 引用是c++的语法,C没有 int temp = S1.top; while (temp != -1) { printf("%d ", S1.data[temp--]); } printf("\n"); } int main(){ SqStack *S PrintStack(*S)//*S是传递解引用后的对象,不再是指针 }
(4)接收为指针类型,传递的是结构体变量的地址
void PrintStack(SqStack *S) {//指针指向传递过来的地址 int temp = S->top; while (temp != -1) { printf("%d ", S->data[temp--]); } printf("\n"); } int main(){ SqStack S;//声明的是一个结构体变量 PrintStack(&S);//传递结构体的地址。 }
浙公网安备 33010602011771号