无锡网站制作,网络营销专业就业前景,本地wordpress 慢,wordpress 菜单分类总结性质
我们如何在一个函数中获取数组的长度#xff1a;
我们都知道#xff0c;在main函数中我们获得数组的长度只需要使用sizeof#xff08;a#xff09;/sizeof#xff08;a【0】#xff09;即可获得#xff0c;但当我们把一个数组传入到方法时#xff0c;c默认把…总结性质
我们如何在一个函数中获取数组的长度
我们都知道在main函数中我们获得数组的长度只需要使用sizeofa/sizeofa【0】即可获得但当我们把一个数组传入到方法时c默认把数组地址视为一个指针在64位系统下c默认一个指针为8字节在使用上述方法只会得到8字节除以4字节因为c把数组首地址视为指针一个指针8字节而int类型占四字节所以我们要传数组时也必须把数组的长度传入。
验证
#includebits/stdc.h
using namespace std;
void sss(int a[]){coutsizeof(a)endl;coutsizeof(a[0]);
}
int main(){int a[]{1,2,3};coutsizeof(a)/sizeof(a[0])endl;sss(a);return 0;
} 结果很明显了在main函数里边是3一到函数里面是8就是由于它被压缩成了一个指针。在64位系统中一个指针被默认位8字节。
我们如何定义一个函数返回一个数组
问及这个问题不得不谈c的函数返回值里无法返回数组类型那我们怎么办我们使用指针我们通过返回指针类型的变量使用指针来访问数组。但是当我们在函数中开辟一个指针来存储数值时当我们的函数结束我们在函数里开辟的指针地址会失效被回收这就牵扯了一个问题即使我们已经把指针地址传给了main函数里的指针时当原指针的地址被回收时我们仍无法通过指针来访问值了怎么办办法有可以使用动态分配内存的方式来解决问题动态分配的内存直到我们手动delete时才会被回收。
代码
#includebits/stdc.h
using namespace std;
int* sss(int* a,int b){int* cnew int[b1];int d;for(d0;db1;d){if(d!b){c[d]a[d];}else{c[d]67;}}return c;
}
int main(){int a[]{1,2,3};
int* bsss(a,3);
for(int c0;c4;c){coutb[c]endl;
}
delete[] b;return 0;
}
结果 大家可以看到我们通过动态内存开辟的地址返回后并未被删除不过需要我们手动delete删除释放内存。
好啦这就是我们使用指针来返回数组的知识。
额外阐释那个一下c的内存机制把。
我们把c的内存分为三块栈内存堆内存全局内存
我们所写的main函数以及我们自定义的函数都是在栈内存中一旦我们的函数结束系统会自动回收内存但是我们开的new之类的那个动态内存会保存在堆空间中只有我们手动delete才会删除而系统不会帮你自动删除而全局变量则是我们开在main函数外边和我们使用static来修饰的变量它会在我们执行完main函数之后自动回收。
这不就得吐槽一下c的内存坏处了我们使用Java的引用数据类型也是自动开辟在堆区的它不用我们自动回收Java底层有回收机制。我们只要记住我们在Java中自定义的方法使用的基本数据类型会随着方法结束而回收Java的垃圾回收机制异常复杂不在这里赘述其实是作者也不会流汗)。不过我们只要直到引用数据类型只要有变量接受便不会被清楚所以我们在Java可以返回数组的地址