扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1、因为数组在内存中是一块连续的内存,只要将该数组的首地址传进去,当然就可以访问整个数组了。值得注意的是,由于只传了首地址,函数不知道数组的维数,所以还得把数组的维数传进去,那就可以完全操作该数组了。
站在用户的角度思考问题,与客户深入沟通,找到玉环网站设计与玉环网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广、国际域名空间、网络空间、企业邮箱。业务覆盖玉环地区。
2、例:有一个函数声明:void fun( int aa[],int size );或者void fun( int *pa,int size );
以上两种声明都一样。
调用上诉函数时:假设有 int ab[10];
fun( ab,10 )就可以了。
数组参数属于指针参数.
指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径.
如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针.
1. 数组参数就是指向第一个元素的指针: #include stdio.h
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
2. 干脆直接声明为指针: #include stdio.h
void getArr(int *p, int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int *p, int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
3. 即使你在形参中指定维数也不起作用: #include stdio.h
void getArr(int p[2], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
getArr(ns, sizeof(ns)/sizeof(ns[0]));
getchar();
return 0;
}
void getArr(int p[2], int si) {
int i;
for (i = 0; i si; i++) {
printf("%d\n", p[i]);
}
}
4. 既然是指针, 其值就有被修改的可能: #include stdio.h
void getArr(int p[], int si);
int main(void)
{
int ns[] = {1,2,3,4,5};
size_t i;
getArr(ns, sizeof(ns)/sizeof(ns[0]));
for (i = 0; i sizeof(ns)/sizeof(ns[0]); i++) {
printf("%d\n", *(ns+i));
}
getchar();
return 0;
}
void getArr(int p[], int si) {
int i;
for (i = 0; i si; i++) {
p[i]++;
}
}
5. 如果是字符数组, 它自己能判断数组尾界: #include stdio.h
void getArr(char p[]);
int main(void)
{
char ns[] = "ABCDEFG";
getArr(ns);
getchar();
return 0;
}
void getArr(char p[]) {
int i;
for (i = 0; p[i]; i++) {
printf("%c: %d\n", p[i], p[i]);
}
}
举个栗子,比如计算a+b的值的函数
#includestdio.h
int plus(int a,int b)
{
int c = a+b;//2.此处定义的c无法被主函数直接调用,因为c为局部变量
return c;//3.要返回计算结果,只能用return语句
}
int main()
{
int i=5,j=7;
int ans = plus(i,j);//1.该过程中,首先将i,j作为参数(与上面的plus函数说明(m,n)一一对应)传递给plus函数。
printf("%d",ans);
}
p函数就是个冒泡递减排序功能。标准函数头写法应该是void p(int a[])而不是void p(int a[5]),即使写成void p(int a[5]),编译器也是按void p(int a[])解释而不按void p(int a[5])解释,而且这里a[]的意思就是定义a是int *型指针。函数p中并没有改变a,改变的是a指向的目标a[0]~a[4]。所以不知你问的具体是啥意思……
看你的代码。
你问题并不在数组传入。你函数mymd5接收password数组,mymd5的password数组变量和外部函数的password地址相同,所以改变其中外部函数的数组也改变。
但你mymd5返回的数组decrypt,是局部变量,当mymd5调用结束,这个数组的内存空间就释放了。你接收了也是NULL。所以要用malloc或calloc申请动态内存。这样不会被释放。
我写了简单案例,你参考:
#includestdio.h
#includemalloc.h
#includestring.h
char *md(char a[]);//错误的数组返回
char *md2(char a[]);//正确的数组返回
int main()
{
char password[10]="123456789",*decrypt=NULL;
decrypt=md(password);
printf("外部函数传递数组到子函数,子函数改变,外部函数也改变,password=%s\n",password);
printf("错误返回方式:局部变量,外部函数接收失败,被自动释放,decrypt=%s\n",decrypt);
decrypt=md2(password);
printf("正确返回方式:动态申请,外部函数接收成功,不会被自动释放,decrypt=%s\n",decrypt);
return 0;
}
char *md(char password[])
{
char decrypt[10]="*********";
password[0]=0,strcpy(password,"abcdefghi");
return decrypt;
}
char *md2(char password[])
{
char *decrypt=(char *)malloc(sizeof(char)*10);
if(!decrypt)
return NULL;
strcpy(decrypt,"*********");
password[0]=0,strcpy(password,"abcdefghi");
return decrypt;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流