1.标准数据类型,int ,char 等。
如果c传递的是单个数据类型,会在被调函数中重新创建一个对象。
所以,无论我们在被调函数中怎么修改,主调函数的值不会发生变化。
2.数组。
当我们传递的参数是一个数组时,c传递的是数组首元素的地址。
所以当我们在被调函数中做修改了,主调函数的值也会变化。
3.自定义数据类型,struct。
首先,对于单个的struct,它的内存分配情况符合上述标准的逻辑。
void test_pass_str_name(T_Str test){
test.data=1;
test.prive = (char *)malloc( PRIVE_LENGTH );
strcpy(test.prive, "hello");
printf(" \n in pass fun \n");
dump_str(test);
printf(" pass fun end \n\n");
return;
}
在被调用时,test会被重新分配一块内存,data值和主调函数的值相等,prive的值也和主调函数相同(指向同一片内存区域)。
我们给prive申请一块内存后,它指向了一个全新的内存区域。
此时,不论我们怎么修改data,和prive指向的内存区域的值,都不会影响主调函数。
但是,自定义数据有个特殊情况,那就是里面带有指针。当我们传递一个数据元素时,被调函数会拷贝全部的数值给新的对象,指针也会拷贝,此时,虽然他们是两个不同的对象,但是因为他们的指针都指向同一片内存区域,所以我们在被调函数中修改了指针指向的内容时,主调函数的值也会改变。
void test_pass_str_name_point(T_Str test){
test.data=1;
// test.prive = (char *)malloc( PRIVE_LENGTH );
strcpy(test.prive, "hello");
printf(" \n in pass fun \n");
dump_str(test);
printf(" pass fun end \n\n");
return;
}
test_pass_str_name_point(test);
printf(" after pass pointer, dump in call fun \n");
dump_str(test);
我们在主函数中再次打印字符串,发现值已经变了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PRIVE_LENGTH 64
typedef struct {
char *prive;
int data;
} T_Str;
void dump_str(T_Str str)
{
printf("------------>\n");
printf("str.data:=%d \n", str.data);
if(str.prive){
printf("str.prive:= %s \n", str.prive);
}
else{
printf("str.prive is null \n");
}
printf("<---------------\n");
}
void test_name(){
char char_array[10];
memset(char_array, 0, sizeof(char)*10);
T_Str str;
//memset(str, 0, sizeof(T_Str)); 报错
memset(&str, 0, sizeof(T_Str));
}
void test_pass_str_name(T_Str test){
test.data=1;
test.prive = (char *)malloc( PRIVE_LENGTH );
strcpy(test.prive, "hello");
printf(" \n in pass fun \n");
dump_str(test);
printf(" pass fun end \n\n");
return;
}
void test_pass_str_name_point(T_Str test){
test.data=1;
// test.prive = (char *)malloc( PRIVE_LENGTH );
strcpy(test.prive, "hello");
printf(" \n in pass fun \n");
dump_str(test);
printf(" pass fun end \n\n");
return;
}
void test_pass_str_array_name(T_Str test[1]){
test[0].data=1;
test[0].prive = (char *)malloc( PRIVE_LENGTH );
strcpy(test[0].prive, "hello");
printf(" \n in pass fun \n");
dump_str(test[0]);
printf(" pass fun end \n\n");
return;
}
void test_str_pass_name(){
test_name();
printf("test str \n");
T_Str test;
memset(&test, 0, sizeof(T_Str));
dump_str(test);
test_pass_str_name(test);
dump_str(test);
test.prive = (char *)malloc( PRIVE_LENGTH );
test_pass_str_name_point(test);
printf(" after pass pointer, dump in call fun \n");
dump_str(test);
printf("\n\n test str array \n");
T_Str test_array[1];
memset(&test_array[0], 0, sizeof(T_Str));
dump_str(test_array[0]);
test_pass_str_array_name(test_array);
dump_str(test_array[0]);
}
#define ARRAY_SIZE 10
typedef char Array[ARRAY_SIZE];
void dump_char_array(Array array){
printf("------------->\n");
for(int i=0; i<ARRAY_SIZE; i++ ){
printf("array[%d]:= %d ", i, array[i]);
}
printf("\n");
printf("<------------\n");
}
void char_pass_name(Array array){
printf("\n\n test pass char \n");
int i=0;
for(i=0; i<ARRAY_SIZE; i++){
array[i]=i;
}
printf("in pass name fun \n");
dump_char_array(array);
printf("pass name fun end \n");
}
void test_char_pass_name(){
Array array;
memset(array, 0, sizeof(char)*ARRAY_SIZE );
char_pass_name(array);
dump_char_array(array);
}
int main(int argc, char *argv[])
{
test_str_pass_name();
test_char_pass_name();
return 0;
}
运行结果:
test str ------------> str.data:=0 str.prive is null <--------------- in pass fun ------------> str.data:=1 str.prive:= hello <--------------- pass fun end ------------> str.data:=0 str.prive is null <--------------- in pass fun ------------> str.data:=1 str.prive:= hello <--------------- pass fun end after pass pointer, dump in call fun ------------> str.data:=0 str.prive:= hello <--------------- test str array ------------> str.data:=0 str.prive is null <--------------- in pass fun ------------> str.data:=1 str.prive:= hello <--------------- pass fun end ------------> str.data:=1 str.prive:= hello <--------------- test pass char in pass name fun -------------> array[0]:= 0 array[1]:= 1 array[2]:= 2 array[3]:= 3 array[4]:= 4 array[5]:= 5 array[6]:= 6 array[7]:= 7 array[8]:= 8 array[9]:= 9 <------------ pass name fun end -------------> array[0]:= 0 array[1]:= 1 array[2]:= 2 array[3]:= 3 array[4]:= 4 array[5]:= 5 array[6]:= 6 array[7]:= 7 array[8]:= 8 array[9]:= 9 <------------