不同于下面的参数引用机制
对于数值型
赋值修改,并不会改变内存地址
inplace操作不会改变内存地址(inplace操作也包括自增自减)
#include
int main()
{
int a=1;
printf("%p\n",&a); // 000000000061FE1C
a=100;
printf("%p\n",&a); // 000000000061FE1C,地址不变
a+=100
printf("%p\n",&a); // 000000000061FE1C,地址不变
return 0;
}
形参与函数内的其他局部函数一样,在进入函数时被创建,退出函数时被销毁
把实际的值复制给函数的形参,不共享内存
#include
int main()
{
int a=20;
int b=10;
int c=a;
c+=1;
printf("a %d\n",a);
printf("c %d\n",c);
printf("a %d\n",a);
return 0;
}
进阶
想当于复制,内存地址不一样
且修改B不会影响A
#include
int main()
{
int a=20;
int b=10;
int c=a;
printf("%p\n",&a); // 000000000061FE18
printf("%p\n",&c); // 000000000061FE14
c+=1;
printf("a %p\n",&a); // 000000000061FE18
printf("c %p\n",&c); // 000000000061FE14
return 0;
}
形参为指向 实参地址 的指针,当对 形参的指向操作时,就相当于对 实参 本身进行的操作
python的传值方式是按照c++中传指针的方式传值的,即不是引用也不是值。如果对象是可变的,那么操作是在传入对象上操作的,如果是不可变的,那么操作后相当于这个标识符指向了另一个对象
(c++传指针本质上也是值传递,只不过传的是地址值,这时候由于是值传递地址值不会被修改,但是存放在地址里的实参的值是可修改的,这时候对应于python传入对象可变的话相当于就在原对象地址上修改这个对象。如果对象本身不可变,相当于传递的是指针常量,自然不能修改这个对象)
python的赋值
a=1
a=2
# 前后两次id(a)不同
返回类型(return_type):一个函数可以返回一个值;不返回值得时候
return_type是void
参数(parameter_list):形参列表
return_type function_name(parmeter_list)
{
...;
}
函数声明会告诉 编译器 函数名称 及 如何调用函数
函数的实际主体可以单独定义
形参的名称并不重要,只有参数的类型是必须的
// 方法1
int max(int num1,int num2)
{
...
}
// 方法2
int max(int num1,int num2); //注意是分号
// 方法3
int max(int,int)
在A文件中声明和定义,在B文件中调用,则需要在调用函数的文件B的顶部声明函数
strcat() // 拼接两个字符串
memcpy() // 复制内存到另一个位置