求详细讲解C语言和C++函数传递原理,重点是数组传递,指针传递,以及什么样传递可以修改实参,什么不可以
例如Qsort(int&L,intlow,inthigh),这里的L是一个指向队列的指针,而这样Qsort(inta[],intlow,inthigh),此处a是数组,数...
例如 Qsort(int &L,int low,int high),这里的L是一个指向队列的指针,而这样Qsort(int a[],int low,int high),此处a是数组,数组名不是地址吗?为什么有不同的调用方法,一个加取地址,一个不加,如果弄成&a,编译器会报错,为什么
展开
4个回答
展开全部
首先函数参数定义的是int *一个名为整数型的指针变量..
所以你传递的必须要是一个名为整数型的指针变量
而int a[m]和int *p其实效果等效..前者和后者唯一不同的是
前者由C帮你完成一个地址分配..代码如下
a=(int *)malloc(sizeof(int)*m);
而后者没有..需要人为分配
而&a是对a指针变量进型本身地址读取..
如果要这样用 需要定义函数为以下
定义前说明下..你的第一个Qsort中int &L和int L效果是等效的..因为都是拷贝类容..
所以新定义
Qsort(int **p,int low,int high);这样定义..你就可以传递&a
但是这样定义的目的是为了修改a指针变量(一维数组)的内容..
由于数组是连续不断的存储..所以这样定义可以完成Qsort(int a[],int low,int high)函数的功能..
但是它多出来的一个功能没有用上--------那就是修改a数组名指向另一个地址(一旦修改了..你的数组就没办法调用了..所以就没必要向我这样定义,然后传递&a)
明白了为什么会报错了吧?
所以你传递的必须要是一个名为整数型的指针变量
而int a[m]和int *p其实效果等效..前者和后者唯一不同的是
前者由C帮你完成一个地址分配..代码如下
a=(int *)malloc(sizeof(int)*m);
而后者没有..需要人为分配
而&a是对a指针变量进型本身地址读取..
如果要这样用 需要定义函数为以下
定义前说明下..你的第一个Qsort中int &L和int L效果是等效的..因为都是拷贝类容..
所以新定义
Qsort(int **p,int low,int high);这样定义..你就可以传递&a
但是这样定义的目的是为了修改a指针变量(一维数组)的内容..
由于数组是连续不断的存储..所以这样定义可以完成Qsort(int a[],int low,int high)函数的功能..
但是它多出来的一个功能没有用上--------那就是修改a数组名指向另一个地址(一旦修改了..你的数组就没办法调用了..所以就没必要向我这样定义,然后传递&a)
明白了为什么会报错了吧?
展开全部
C语言参数传递都是值传递形式;
指针也是——指针本身也是变量,指针a的值赋值给指针b,则通过b也就能访问a指向的地址空间 。
C++不熟,就不乱说话了
指针也是——指针本身也是变量,指针a的值赋值给指针b,则通过b也就能访问a指向的地址空间 。
C++不熟,就不乱说话了
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,C++中第一个函数里int &L,这里的&并不是取址符,而是一个引用~你可以上机试一下~
对于&a,你对一个指针取地址,得到的是一个指向指针的指针,在函数内部使用的时候很有可能出现地址悬垂的现象,这也是编译器报错的原因~
对于&a,你对一个指针取地址,得到的是一个指向指针的指针,在函数内部使用的时候很有可能出现地址悬垂的现象,这也是编译器报错的原因~
追问
那数组a和定义的L,&a,&L意义不一样是吧?前者是取地址,后者是引用。可以解释一下为什么会有这种不同吗?
追答
C语言学得比较早已经忘记啦~在C++里你定义int& a或者int &a其实是一样的,定义的都是引用~
后面的那个&a 没有类型说明符,那就是一个取址的操作啦~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a 本身表示的就是地址,所以&a就没有意义了,int &L表示的取地址,所以和这里的a是等价的,这是地址函数调用中的地址传递。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询