扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
首先要理解一点,数组在做参数传递的过程中会损失数组的长度信息,退化成一个指针
我们注重客户提出的每个要求,我们充分考虑每一个细节,我们积极的做好网站设计制作、做网站服务,我们努力开拓更好的视野,通过不懈的努力,创新互联建站赢得了业内的良好声誉,这一切,也不断的激励着我们更好的服务客户。 主要业务:网站建设,网站制作,网站设计,重庆小程序开发,网站开发,技术开发实力,DIV+CSS,PHP及ASP,ASP.Net,SQL数据库的技术开发工程师。
例如你形参写成(char s[10]),或者干脆(char s[]),函数只能接收到一个char *
所以:
char dp[n][m]的类型本质上是数组的指针,即char (*)[m],它是指向长度为m的char数组的指针
char **是char *的指针,指针是由数组退化来的,所以一般来说,它原来是一个char *的数组,即 char *ps[m]。
数组的数组(或数组的指针)和指针的数组(或指针的指针),当然是不同的两个类型。
至于如何修改,需要你明确你的函数要处理数组的数组,还是指针的数组,再根据情况修改。
如果是数组的数组,那么参数变为:testlength(char (*p)[max],注意这里只能是数或者宏,不能是变量,调用时实参不用变化
如果是指针的数组,那么参数不变,char **dp,实参变为:char *p[2] = {s1, s2}
#include stdio.h
//指针加*是不会改变其指向的,只会修改其中的内容
int *f(int *s, int *t) //s指向i,t指向j
{
if (*s *t) //这里比较的是i与j的值
{
*s = *t; //*s表示取s地址的内容,即i,所以*t是表示j,这里是将j赋值给i
//所以改变了i的值,但是并没有改变s与t的指向,还是分别指向i与j
}
return s;
}
int main()
{
int i = 3, j = 5;
int *p = i; //p是指向i的
int *q = j; //q是指向j的
int *r;
r = f(p, q); //将s的地址赋值给r
printf("%d, %d, %d, %d, %d\n", i, j, *p, *q, *r);
return 0;
}
运行结果是:5, 5, 5, 5, 5
#include stdio.h
int k = 5;
void f(int *s) //这里传参只是将p的地址赋值给s,也就是将s指向了m
{
s = k; //将s指向k,并没有改变p的指向
}
int main()
{
int m = 3;
int *p = m;
f(p); //所以程序执行完,p还是指向m,而s是指向k的
printf("%d, %d\n", m, *p);
return 0;
}
运行结果:3, 3
#include stdio.h
//指针加*是不会改变其指向的,只会修改其中的内容
//如果指针不加*,则赋值就是改变其指向
int *f(int *s, int *t) //s指向i,t指向j
{
if (*s *t) //这里比较的是i与j的值
{
s = t; //s表示的是指针,这里不是表示其内容,所以这里是将t指向的地址赋值给了s
//也就是s与t是指向同一块内存空间,也就是将s也指向了j
}
return s;
}
int main()
{
int i = 3, j = 5;
int *p = i; //p是指向i的
int *q = j; //q是指向j的
int *r;
r = f(p, q); //将s的地址赋值给r,r也指向了j
printf("%d, %d, %d, %d, %d\n", i, j, *p, *q, *r);
return 0;
}
运行结果:3, 5, 3, 5, 5
这一类题目其实只要打个草稿就行了,写两个数字,然后*p就是表示取其中的内容,p就表示其指向(也就是内容的地址),只要是加*的赋值就表示改变其p指向的变量赋值,如果没有加*就是改变指针的指向。
C语言中参数分为实际参数(实参)与形式参数(形参)。
实际参数是在调用时传递个该函数的参数。
形式参数是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传如的参数。
实际参数是在调用时传递个该函数的参数.
举一个很简单的例子:
#includestdio.h
int f(int b) // b为形参
{
return b;
}
void main()
{
int a=1;
printf("%d",f(a));// a为实参
}
给你举个例子吧,这样就容易理解得多。
例子:设计一个函数func();在调用它时每次实现不同的函数功能,输入两个参数a和b,第一次调用func()时找出a和b中的较大者,第二次调用找出较小者,第三次调用求a和b之和。
说明:格式
(*p)()
表示定义一个指向函数的指针变量p,在c语言中这个格式是固定的,前面的()表示p先和*结合,是指针变量,后面的()表示p指向一个函数。前面的()不能省略,如果写成
*p(),由于()优先级比*高,那就表示p()函数返回的是一个指针,p本身就是函数不是指针了,意思完全变了。
任何一个函数,函数名就是该函数的入口地址(起始地址),也就是说函数名就是个地址,从这个地址开始,函数占用一段内存单元。因此可以用一个指针变量来指向这个这个函数名,这样就相当于指向这个函数了。所以下面的max,min,add函数都是一个地址,分别调用时就是赋值p=max,p=min,p=add,也就是(*p)(x,y)分别就等于max(x,y),min(x,y),add(x,y).
程序在win-tc和Dev-c++下调试通过。
#include
stdio.h
#include
conio.h
int
max(int
x,int
y)
{
return(xy?x:y);
}
int
min(int
x,int
y)
{
return(xy?x:y);
}
int
add(int
x,int
y)
{
return(x+y);
}
int
func(int
x,int
y,int
(*p)())
/*定义指向函数的指针变量p,关键1*/
{int
result;
result=(*p)(x,y);
/*调用相应函数,函数名即地址给p,这样p指向该函数,关键2*/
printf("%d\n",result);
}
main()
{
int
a,b;
printf("Please
input
two
integers
a
and
b:\n");
scanf("%d%d",a,b);
printf("max=");
func(a,b,max);/*相当于赋值p=max*/
printf("min=");
func(a,b,min);/*相当于赋值p=min*/
printf("add=");
func(a,b,add);/*相当于赋值p=add*/
getch();
}
看看这个例子就知道了,在同一文件夹先编译hello.c再编译main.c运行
main.c
#include stdio.h
#include process.h
int main()
{
char a[100];
int b;
printf("调用hello.exe, 第一个参数为改应用程序的名称\n");
execl("hello.exe","1hello","2hello",NULL);
printf("进程已经被递交给了hello.exe,这里不会再执行");
return 0;
}
hello.c
#include stdio.h
int main(int argc, char *argv[])
{
int i;
printf("命令行参数有%d个,分别是:\n",argc);
for(i=0;iargc;i++)
printf("%s\n",argv[i]);
return 0;
}
除了execl
还有spawnl:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流