
常规类型(int、double、float、char等)的都不会变
指针类型(int、double、float,char等)的都会变
数组类型(int[]、double[]、float[],char[])的也都会变
类也会变(c++范畴)
总而言之:参数指向值的,都不会变;参数指向地址的都会变(数组也是指向地址的。可以理解为本质也是指针)
void fun1(char str[])
{
char p="hello world!";
strcpy(str,p);
printf("fun1: %s\n",str);
}
这个会改变原字符数组的值,这里数组名作为参数,其实传递的是数组首元素的地址,形参是指向实参地址的一个变量。
即 fun1(str); 函数调用后, 形参函数内的str所指向的内存地址 和 外面实参str地址是同一个。
strcpy(str,p); 是字符串拷贝函数,赋值后,其实相当于对str所指向内存内容的处理,将p指向的地址的内容赋值给了 str地址的内存中。 又因为 函数内参数str 和外的str是指向的同一个地址,因此会改变原始数组的值。
void fun2(char str[])
{
char p="hello world!";
str=p;
printf("fun2: %s\n",str);
}
该函数调用后不会改变原来的值。
相当于是调用的时候 函数内 str 地址 和 外面的str地址是指向同一个内存单元。
不同的是 str=p; 这个地方相当于将函数内的 str指针的指向 了p指针的指向的地址。只是地址指向变了,并没有对原始地址的内容作 *** 作,因此不会改变。
另外,函数写的有些问题, main函数里面 字符数组太小额,如果调用函数1 就会出现字符串溢出的情况(helloworld 字符太多了),会出现错误的。还是把数组改大点好。
Python的自定义函数格式中规中矩,用def引导自定义函数名,用括号给出该函数的参数,在冒号后换行通过缩进确定函数体。在格式上和条件判断语句有些相似。
如果函数名和变量名冲突了,相当于重新赋值。而python解释是从上到下的,也就是说此时谁在下面谁占用这个变量名。剩下的那个就只能在内存中等待垃圾回收了。
自定义函数的参数:
按道理来说,即使Python不严格要求定义函数参数,但这方面的知识有助于理解自定义函数中参数 *** 作的情况,还是应该说明一下的。
可以简单地理解为在定义函数时括号中声明的参数是我们在函数使用中会用到的参数,在调用函数时括号中的变量就是参加函数运算用到的变量,换个名字参数(用于定义)和变量(用于调用)就足以理解了。
C语言中主函数中定义的变量只能在主函数中使用,所以你还得再定义一个变量。
当然,捏可以把主函数中定义的这个变量传递给被调用的函数作为参数。
例如
void fun(int x)
{
}
main()
{
int num=9;
fun(9);
}
但是如果你要在被调用函数中使用这个变量例如
fun()
{
num++;
}
像这样,就是错的,编译器会报错,main中定义的变量是局部变量,只能在main中使用。
你可以在main外部定义一个变量,这样在被调用函数中也就可以使用了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)