函数参数的接收和传递的类型,包括指针,引用,值的区别

概念

1.SqStack SSqStack *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);//传递结构体的地址。

}

 

posted @ 2025-04-11 11:36  hacker-dreamer  阅读(27)  评论(0)    收藏  举报