Comparison of C and C ++: the parameter passing


1. C language

1.1 General parameters

#include <stdio.h>

void f(int i) // 置0
{
    printf("f   : %p %d\n", &i, i);
    i = 0;
    printf("f   : %p %d\n", &i, i);
}

int main()
{
    int a = 1;
    printf("main: %p %d\n", &a, a);
    f(a);
    printf("main: %p %d\n", &a, a);

    return 0;
}

operation result

Analysis: Because the address argument (0022FEDC) parameter and address (0022FEC0) different, and p arguments parameter i is not the same variable. I modifications will not change a.

1.2 Parameters Pointer

#include <stdio.h>

void f(int *i) // 修改指针
{
    printf("f   : %p %p %d\n", &i, i, *i);
    int m = 0;
    i = &m;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a = 1;
    int *p = &a;
    printf("main: %p %p %d\n", &p, p, *p);
    f(p);
    printf("main: %p %p %d\n", &p, p, *p);

    return 0;
}

operation result

Analysis: Because the argument pointer address (0022FED8) parameter and pointer address (0022FEC0) different arguments parameter p and i are two different pointers. Because the values ​​of p and i are equal, are 0022FEDC, they point to the same variable. Modify i will not change p.

#include <stdio.h>

void f(int *i) // 修改指针指向的值
{
    printf("f   : %p %p %d\n", &i, i, *i);
    *i = 0;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a = 1;
    int *p = &a;
    printf("main: %p %p %d\n", &p, p, *p);
    f(p);
    printf("main: %p %p %d\n", &p, p, *p);

    return 0;
}

operation result

Analysis: Because the argument pointer address (0022FED8) parameter and pointer address (0022FEC0) different arguments parameter p and i are two different pointers. Because the values ​​of p and i are equal, are 0022FEDC, they point to the same variable. Modify * i will change * p.

1.3 array parameter

#include <stdio.h>

void f(int i[]) // 修改数组i
{
    printf("f   : %p %p %d\n", &i, i, *i);
    int m = 0;
    i = &m;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a[3] = {1, 2, 3};
    printf("main: %p %p %d\n", &a, a, *a);
    f(a);
    printf("main: %p %p %d\n", &a, a, *a);

    return 0;
}

operation result

#include <stdio.h>

void f(int i[]) // 修改数组元素i[0]
{
    printf("f   : %p %p %d\n", &i, i, *i);
    i[0] = 0;
    printf("f   : %p %p %d\n", &i, i, *i);
}

int main()
{
    int a[3] = {1, 2, 3};
    printf("main: %p %p %d\n", &a, a, *a);
    f(a);
    printf("main: %p %p %d\n", &a, a, *a);

    return 0;
}

operation result

Analysis: transmitting array, the actual delivery location or address of the start of the array elements. Argument with a parameter i arrays are two different names, but their values ​​are 0022FED4, point to the same variable. I modifications will not change a, modifications i [0] will change a [0].

1.4 summary

  1. In C language, all function parameters are passed by value, also an address value. Function call, the argument value is assigned to the parameter, modify the parameter does not change the argument.
  2. The actual transfer address pointer variable transmission. Parameter and argument pointers are different, but point to the same variable. Modified parameter does not change the argument, change the variable parameter will change the object pointed to by the argument points.
  3. Transmitting array is actually the starting address of the array elements pass. Similarly the pointer, parameter modification does not change the argument, parameter modification changes the array elements of array elements argument.

2. C ++ language

2.1 General parameters

#include "iostream"
using namespace std;

void f(int i) // 置0
{
    cout << "f   : " << &i << " " << i << endl;
    i = 0;
    cout << "f   : " << &i << " " << i << endl;
}

int main()
{
    int a = 1;
    cout << "main: " << &a << " " << a << endl;
    f(a);
    cout << "main: " << &a << " " << a << endl;

    return 0;
}

operation result

Analysis: & a is 0x22fecc, & i is 0x22feb0, a different and i is a variable, a modification will not change i.

2.2 Pointer parameters

#include "iostream"
using namespace std;

void f(int *i) // 修改指针
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    int m = 0;
    i = &m;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a = 1;
    int *p = &a;
    cout << "main: " << &p << " " << p << " " << *p << endl;
    f(p);
    cout << "main: " << &p << " " << p << " " << *p << endl;

    return 0;
}

operation result

#include "iostream"
using namespace std;

void f(int *i) // 修改指针指向的变量
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    i[0] = 0;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a = 1;
    int *p = &a;
    cout << "main: " << &p << " " << p << " " << *p << endl;
    f(p);
    cout << "main: " << &p << " " << p << " " << *p << endl;

    return 0;
}

operation result

Analysis: When passing a pointer, it will be copied into the parameter arguments. Parameter argument i and p are two different pointers, which point to the same variable a. I will not change the modified p, modify * i will change * p.

2.3 array parameter

#include "iostream"
using namespace std;

void f(int i[]) // 修改数组
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    int m[3] = {0, 0, 0};
    i = m;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a[3] = {1, 2, 3};
    cout << "main: " << &a << " " << a << " " << *a << endl;
    f(a);
    cout << "main: " << &a << " " << a << " " << *a << endl;

    return 0;
}

operation result

#include "iostream"
using namespace std;

void f(int i[]) // 修改数组元素
{
    cout << "f   : " << &i << " " << i << " " << *i << endl;
    i[0] = 0;
    cout << "f   : " << &i << " " << i << " " << *i << endl;
}

int main()
{
    int a[3] = {1, 2, 3};
    cout << "main: " << &a << " " << a << " " << *a << endl;
    f(a);
    cout << "main: " << &a << " " << a << " " << *a << endl;

    return 0;
}

operation result

Analysis: When passing arrays, actually passed is a pointer to the first element of the array pointer. Parameter argument a and i are two different pointers, which point to the same variable. I modifications will not change a, modifications i [0] will change a [0].

2.4 Reference Parameters

#include "iostream"
using namespace std;

void f(int &i) // 修改i
{
    cout << "f   : " << &i << " " << i << endl;
    i = 0;
    cout << "f   : " << &i << " " << i << endl;
}

int main()
{
    int a = 1;
    cout << "main: " << &a << " " << a << endl;
    f(a);
    cout << "main: " << &a << " " << a << endl;

    return 0;
}

operation result

Analysis: i is a parameter reference type, i references a, i.e., a i is an alias. Operation of a i actually operated, it will change to modify i a.

Note: C language, not a parameter reference type.

#include <stdio.h>

void f(int &i)
{
    printf("f   : %p %d\n", &i, i);
    i = 0;
    printf("f   : %p %d\n", &i, i);
}

int main()
{
    int a = 1;
    printf("main: %p %d\n", &a, a);
    f(a);
    printf("main: %p %d\n", &a, a);

    return 0;
}

Compile Error

Runtime Error

2.5 summary

  1. In C ++, the parameter passed into the value transfer and reference pass two kinds. The program will create a parameter function is called, and with arguments for parameter initialization.
  2. Pass an array is actually passing a pointer pointing to the first element of the array. And passing a pointer array is passed values ​​are regarded as passed.
  3. In C ++ parameter may be a reference type, C are not.
Published 77 original articles · won praise 25 · views 10000 +

Guess you like

Origin blog.csdn.net/qq_34801642/article/details/104945020