应为:
我们会使用这个100来初始化12行中的x值(相当于初始化了一个对象x)。
复杂点的:
第7行的{1, 2, 3, 4, 5}就是初始化列表。我们可以使用初始化列表来初始化vector(std::vector<int>
),然后在13行调用时,调用完之后,fun函数返回一个std::vector<int>
,相应地,我们使用std::vector<int>
初始化变量x,x的类型就是std::vector<int>
,其中包含12345这5个数字。
但注意,如果使用initializer_list。我们使用{1, 2, 3, 4, 5}初始化initializer_list,会有很多warning:
initializer_list里面包含两个指针,一个指针指向{1, 2, 3, 4, 5}中头元素,一个指向{1, 2, 3, 4, 5}的最后一个元素的下一位。如果在13行,把initializer_list返回之后,则x是initializer_list这样的类型的对象,这个对象里面包含两个指针。但有个问题,{1, 2, 3, 4, 5}是个自动对象(我们会在fun函数结束之后,这个自动对象就被销毁了),如果这个自动对象被销毁了,那么x指向initializer_list(initializer_list里面包含两个指针),但这两个指针指向了一个被销毁的对象第一个元素和最后一个元素的下一位。接下来,如果我们使用x做一系列操作时,这些操作是没有意义的。
因为函数f()中的形参x和y只是拷贝了实参的值,它们的地址是不同的,所以函数f()中的交换,只改变了函数的形参,不会改变main方法里传入变量的值。
测试代码如下:
参考链接:
#include <stdio.h>
// https://blog.csdn.net/m0_53804791/article/details/116049548
void f(int x, int y){
int t;
printf("in f(), before change , &x=%p, &y=%p, x=%d, y=%d\n",&x,&y,x,y);
if(x<y){
t=x;
x=y;
y=t;
}
printf("in f(), after change , &x=%p, &y=%p, x=%d, y=%d\n\n",&x,&y,x,y);
}
int main(void){
int a=4,b=3,c=5;
printf("in main(), before , &a=%p, &b=%p, &c=%p, a=%d, b=%d, c=%d\n\n",&a,&b,&c,a,b,c);
f(a,b);
f(a,c);
f(b,c);
printf("in main(), before, &a=%p, &b=%p, &c=%p, a=%d, b=%d, c=%d\n\n",&a,&b,&c,a,b,c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
和 return 没关系,
f函数要想交换,正确的写法是
void f(int *x, int * y)
{
int t;
if (*x < *y) { t = *y; *y = *x; *x = t; }
}
main里面
f(&a, &b); f(&a, &c); f(&b, &c);