函数指针形参,函数用形参指针哪个效率高
函数指针形参,函数用形参指针哪个效率高详细介绍
本文目录一览: 指针变量能只能作为函数的形参不可以作函数的实参对还是错
错。
只是要不然只有形参而没有实参的话,函数传参数没有用。但一般函数要用指针时会用引用的。
#include
int add(int x[])//这里的数组即变成指针了
{
return x[0]+x[1];
}
int main()
{
int i[]={1,2};
printf("%d\n",add(i));
return 0;
}
扩展资料:
存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。
举例:int a = 68 ,系统为变量a分配的首地址为0X065FDF4H,声明空指针long *p = NULL,p=&a是存放变量a地址的指针变量,即p=&a中存放的值为0x065FDF4H(a的值为68,&a的值为0x065FDF4H)。
对变量a的访问有两种方式:一是直接按地址0x065FDF4H找到a的存储单元,从而对变量a进行访问;二是按系统为p=&a分配的地址先找到p=&a,然后根据p,&a的值(即变量a地址0x065FDF4H)找到变量a在内存中的存储单元,从而对变量a进行访问。对于前一种访问方式称为直接访问方式,后一种访问方式称为间接访问方式。
参考资料来源:百度百科-指针变量
错,指针变量既可以作为函数的形参,也可以作函数的实参。
当数组名作函数的参数时,传递到是数组的起始地址,形参是用来接受从实参传递过来的实参数组的地址的。因此,形参应该是一个地址变量(只有指针才能存放地址)。
数组名就是数组的首地址,实参向形参传递数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。这就好像同一件物品有两个彼此不同的名称一样。同样,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可以作为函数的参数使用。
指针作为实参,指针作为形参:
扩展资料:
在c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。
指针实质是一个内存地址,这个内存地址就是指针的指向地址,这个地址及其以后的地址中的内容就是我们说的指针指向的内容。函数在传递参数时传递的一定是形参。
参考资料来源:百度百科-指针变量
C语言中当形参是指针,实参是什么?当实参是指针,形参是什么?为什么?
形参是指针,实参肯定要接收指针的,,你说是什么?
int a = 10;
int *p = &a;例如&a的形参,实参就是*p了。等等。。自己举一反三吧。
第一个问题:
形参是指针,实参就应该是对应数据类型的地址。
例如:
swap(int *x,int *y)
{
int t ;
t = *x;
*x = *y;
*y = t;
}
int main()
{
int a = 2,b=6;
swap(&a,&b);
//因为swap函数的形参是int类型的指针,所以传入的实参应该是int类型变量的地址
return 0;
}
第二个问题:
当实参是指针的时候,形参应该是什么?
其实很简单,你只要把
第一问列出来 ①实参:地址 ②形参 :指针
一一对应出来 ①实参:指针 ②形参:指针的指针
因为你要在局部函数中改变实参,就需要传递它的地址,指针也是如此,把它类比为int型变量就好了。
个人理解,希望能帮到你,如有不对,欢迎指正
在c语言中,指针作为函数参数,形参只能传递值,而不能传递地址,是怎么回事?
建议上代码
问题中说法本来就是错的
形参指的是你声明或者定义用的那个参数,本来也不是传值的
至于传值还是传地址,如果形参是指针p,那么传递过去的p值就是地址,同时也是自身的值,这个看具体使用情况
所以一句话,show me your code
传值和传地址本质都是传值,只不过有些值表示地址
C语言中,函数参数只能传值。与传值对应的是传引用,C语言不支持函数参数传引用,C++语言才支持。
C++传引用函数:
void foo(int& a) { a = 3; }
假如a = 2,执行foo(a)后,a = 3。
---
C语言可以模拟传引用,方法是通过指针来实现:
void foo2(int* ap) { *ap = 3; }
假如a = 2,执行foo2(&a)后,a = 3
foo2(&a)调用本质上仍然是传值,只不过传递的是指针,指针即是地址,地址本质上是一个无符号整数。
如果:
void foo3(int b) { b = 3; }
假如a = 2,执行foo3(a)后,a = 2。这是因为foo3(a)调用过程中,a值传给形参b,修改b的值与实参a无关。
注意到,foo3(a)与上述foo(a)传引用的调用是形式一样的。
既然C语言通过指针可以实现传引用调用,为什么C++还要引入引用这个特性呢?这是因为C++引入的很多新特性需借助引用来实现,比如,拷贝构造函数等等。
指针做形参有什么用
指针是用来指向某个变量,而引用是给变量取个别名,其作用就如同typedef一样。
用引用作形参时在调用函数里就像操作实参一样,不需要考虑实参的地址问题
用指针做形参时,由于指针的值是变量的地址,所以要通过对地址解引用来操作其所指的变量
在c++里优先选择引用类型作为形参,因为操作一个变量比操作一个指针要简单的多
但用指针作为形参的好处是它可以通过自增或自减改变它的指向
建议你调用函数时用引用类型的形参!
在C++中,函数的形参为指针,那么实参应为_____类型的参数
形参是指针的,实参是数组,变量的地址,指针(可以是子类的指针)
实参是指针的,形蚕是引用,数组,指针(可以是父类的指针)
当然是引用了,还能是什么?比如说
int
a;
void
fun(int
*p
)
{
表达式;
}
在main函数中调用的时候是这样
fun(&a);
形参实参结合的时候是这样:int
*p
=
&
a
与形参类型相同的指针
比如如果形参是指向整数类型的指针,那实参也应该为指向整数类型的指针。
当然也可以是整型数组,因为整型数组的首地址实际上是特殊的指向整数类型变量的指针。
再如形参是指向字符类型的指针,那实参应该为指向字符类型的指针。当然也可以是字符串首地址,原理与上类似
函数用形参指针哪个效率高
用形参指针效率高。使用形参指针还可以更加灵活地操作数据,可以在函数内部修改原始数据,而不需要返回值进行赋值操作。因此,对于较大的数据和需要频繁操作数据的情况,使用形参指针可能会更为方便和高效。
函数形参 引用和指针有什么区别
void func(int &val) //reference
{
//......
}
void func2(int *pVal) //pointer
{
// ...
}
int main ()
{
int nVal = 10 ;
int&ref = nVal ; //reference to nVal
func(nVal ) ;
func2(&nVal) ;
return 0 ;
}
引用其实就相当于是一个变量的别名,而指针是存储指向变量的地址。引用不会另外占用内存空间,三十指针自己会占用四个字节的内存,存放指向变量的地址,自己设断点调试一下就清楚了
关于指针和引用的区别,首先要了解变量声明的实质。
先看一个代码
int a=10;该语句其实是在栈上分配了一块内存空间,整数类变量占用4字节,所以这句代码的意思就是分配了一块连续4字节的内存空间,并往该空间存入10 。a代表着这块内存空间的首地址(简称地址,下同),a是个代名,一个标示符,这个名字只存在于源代码,编译之后就是个地址。
所以当定义一个变量时,一个变量其实包含两个属性,地址(占用内存空间)和值,名称代表地址,而当执行赋值语句时,编译器默认往a代表的地址中存入数据(存入所在内存空间),而不是改变地址。
再看一段代码
int a=10;int &b=a;声明一个整数类的引用,名称为b,如果说变量含有地址和值两个属性,那么引用不能称为变量,它不具备自己所代表的内存空间更没有自己的值,它仅仅就是个代名词,它什么都没有,所谓徒有虚名,没有实质,它只是a的一个别名,或者说它是借用了a的地址和值,当对b赋值或其他访问时,等于直接在访问a。编译之后也是a的地址。
再看一段代码
int a=10; int *p=&a;这段代码的后一句声明了一个指针变量,并取a的地址赋值给p,既然是变量,它就包含2个属性:地址和值,与其他变量不同,它专门用于保存其他变量的地址(地址是个无符号整数,没见过门牌号码是负的^_^),此处p所在内存空间存入a的地址,当然p同样代表自己的地址。
最后再看段代码
void main(){ int a=10; int &b=a; int *p=&a; fun1(b); fun2(p); cout<
<a; 输出12}void fun1(int & c){ c++;}void fun2(int * ptr){ *ptr++;}上述代码中定义完了后先调用fun1,fun1的形参是引用,因此主函数中将b传入fun1,由于是引用,前面说过,引用只是个别名,它本身没有地址空间,因此传入的其实是a的地址。传入后,编译器对引用不做处理,因此在fun1函数体内,执行c++时,其实就是对a的值加一,编译后c其实就是a的地址,这就是引用作为形参的调用情况。
虽然调用fun2,fun2的形参是指针变量,因此主函数中将p传入fun2,由于p是个变量(指针变量),是变量都有自己的内存空间和值(此处p的值是a的地址),对于变量传递,编译器会复制一份值COPY,因此在函数fun2内部,首先为ptr被分配一个内存空间(创建局部变量,函数退出时释放),然后将外部p的值复制到ptr中,也就是a的地址被复制到ptr中。然后执行*ptr++,就是对ptr所指向的地址中的值加一,也就是对a的值加一。函数通过ptr间接对a操作。
总结:
引用作为形参传入函数时,不做任何处理直接使用,而指针作为形参传入函数时,要为形参分配内存空间创建一个临时局部变量,并将实参指针的值复制到形参中。
关于指针和形参结合的问题。
第一个是,第二/四是一样的,第三是引用。请认同!
第二个不是,剩下的都是
fun (int a[10] ){...} // 这个不是, 其他都是
C++不能直接传递数组给函数,但可以使用数组名作为数组指针传递给函数。
函数接收指针有三种方法,
int * 指针
int [10] 定长数组形式
int [] 不定长数组形式
以上三种效果是一样的,都是接收指针,因此1、2、4都是指针。3是引用。
这里面要注意的是,int a[10] 用于定义时其含义是创建一个含10个整数元素的数组。但用于形参时用来接收整数指针,长度无严格限制,编译时不会检查。
例如,下面的程序可以编译通过并正常运行。
//形参维度是1void fun(int p[1]){ p[10]=10;//注意这里,理论上越界了,但是由于形参只是用来接收指针,所以编译器不会报错} main(){int a[100];//这里创建一个100个元素的数组,保证fun函数不会越界就行fun(a);cout <
<a[10]<<endl;getchar();}
</a[10]<<endl;getchar();}
C语言中函数实参变量用指针时, 形参变量也必须用指针? 判断对错 请举例说明, 详细点, 谢谢了
对,函数的实参和形参类型必须一致。
如果形参是指针,实参可以是指针变量,也可以是指针常量。
比如int a[10],*p=a;
s(a)或s(p);
void s(int *p)
{}
错了。书上原文是尽量
指针可以用数组来接收
不信你运行下以下代码
形参为指针的函数是否为形参分配空间
形参如果为指针的话,是不会为它分配空间的。他与实参共用同一个存储空间,这样才能实现互相影响,从而参数传递。
当然要分配空间,不然传过来的实参的值放哪?
要理解你这个问题,你必须首先明白传值和传指针的区别。
给一个函数传值,实参会把具体的值传给函数的形参,函数拿到这个值以后会产生一个临时变量(这个临时变量你是看不到的),你的整个函数的操作就是在操作这个临时变量,所以你在函数内部给,形参赋值并不能改变实参的值。
给一个函数传指针,实参会把外部存储值的地址给形参,注意这是地址,证明外部已经申明了存储该实参值的内存,不然不会存在存储某值的地址,所以内部不再需要分配空间;当然有的时候我们的实参只申明了一个指针,并没有申请地址,这个时候编译是没有问题的,但是在运行的时候我们会把实参指向的内容的地址传给形参,而此时实参并没有申请空间,这个时候就会出现一个错误。
所以,当我们传递给函数一个指针的时候,我们的目的是要操作某一块内存,既然要操作某一块内存,那么这块内存首先必须存在,既然已经存在在函数内部在分配空间就没有必要,即使分配了也没有任何意思,如果不释放还会出现内存泄露情况