⑴ c语言里调用自定义函数时数组是传值还是传地址
数组么?一般用指针来传递以便用来读取数组。但一般的函数参数的传递时值传递。
⑵ 计算机C语言传值传址的问题。。希望有解析和例题
传值,若在函数中改变了该值,原值不变,因为传进来的是个副本;
传址,若在函数中改变了该值,则原值也变,因为传进来的是地址,则在函数中的操作相当于直接操作该值
⑶ c语言关于传值与传址的问题
给你来点通俗点的:
有个关键的东西你没有考虑到,函数里的a与函数外的a并不是一个a,请看:
int
a
=
3;
int
b
=
5;
void
fun(int
*A,int
*B)
{
int
*C;
//
1
C=A;
//
2
A=B;
//
3
B=C;
//
4
}
fun(
&a,
&b
);
我们来看一下,运行1,2,3,4句话的结果
1.
int
*C;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a30
int
a
+
B
0x00424a34
int
b
+
C
0xcccccccc
2.
C=A;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a30
int
a
+
B
0x00424a34
int
b
+
C
0x00424a30
int
a
<--改变
3.
A=B;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a34
int
b
<--改变
+
B
0x00424a34
int
b
+
C
0x00424a30
int
a
4.
B=C;
+
&a
0x00424a30
int
a
+
&b
0x00424a34
int
b
+
A
0x00424a34
int
b
+
B
0x00424a30
int
a
<--改变
+
C
0x00424a30
int
a
从上面的调试结果可以看出来,&a
&b的值一直没有改变,在改变的只是函数内部A
B的值。一旦函数结束,a,
b的值是不是还是没有改变?
在进入fun之前,会有个拷贝的过程
A
<->
&a,
B
<->
&b,很多时候都是会将外部变量和参数写成一样,就很容易造成困扰,其实函数内外根本不是一个东西。
A
和
&a
都指向同一个地址是没有错,但你把A的指向改变下,&a的指向你可是没有变吧。
换一下,用
*A
和
a来比较
A指向的那个内容就是a,修改*A就是修改a
所以在一些情况下(如COM中),就会有一些函数的参数是
void**
ppObj,只有这样才能将传进去的一个指针的值改变。
⑷ c语言 是传值 还是传址的
传值和传地址的区别在于函数是否对形参分配内存。
C的函数对简单变量和指针形参分配内存,所以是传值。
但数组作参数,因为数组对内存要求比较苛刻并消耗大量内存,所以不再分配空间,而传地址。
数组传地址的例子:
#include<stdlib.h>
#include<stdio.h>
void f (int a[3]){a[0] = 1; a[1] = 2; a[2] = 3;}
void main()
{
int a[3];
(void) f(a);
printf("%d %d %d\n",a[0],a[1],a[2]);
}
正因为传地址,所以能把函数运算结果带回主程序。
我估计,对于结构也是传地址。
⑸ 在c语言中,指针作为函数参数,形参只能传递值,而不能传递地址,是怎么回事
建议上代码
问题中说法本来就是错的
形参指的是你声明或者定义用的那个参数,本来也不是传值的
至于传值还是传地址,如果形参是指针p,那么传递过去的p值就是地址,同时也是自身的值,这个看具体使用情况
所以一句话,show me your code
⑹ C语言传值传址选择题
这是C++代码啊,好吧虽然用的是C语法而已
你也说了啊,是传值调用,传值调用的特点是什么?形参永远是实参的副本,即形参的任何动作都不会影响实参本身
基于此,swap_str函数形参指针ab无论值为多少,原实参str_a, str_b都不会发生变化啊,但是实参指针指向的内容就不一定了,此处是也没有变化
P.S. 既然都用到C++了,顺带讲下,C++的函数用引用调用的,与传值调用不同
⑺ C语言:为什么第一个函数是传址调用第二个函数是传值调用并没有看出它们的调用方式有哪些区别
第二个程序传入的t是主函数中a的一个副本(也就是所谓的值传递,传入到子函数中的是a的值),所以,t的变化与a无关
而
第一个程序中传入的a是个数组名,也就是是个地址,a【1】=b就是将b中的数据存入了a地址中,所以,能通过a带回到主程序中。
⑻ 一道c语言解答函数返回多个值,用全局变量,传址参数,和返回结构体变量,他们之间的优缺点在哪,求解答
全局变量:
优点:变量在各个函数间自由调用和赋值,不需要考虑各个函数直接的传值问题,程序简单。
缺点:①资源占用多;②函数的移植性差;③全局变量用的多容易混,程序员记忆量大,有时需要列一个变量表。
结构体变量:
优点:方便。
缺点:使用范围受限,如果几个返回值正好是某个已有结构体变量的内容,那才是不二的选择。如果单独为了返回几个值而定义一个结构体变量,则得不偿失,增加编程的工作量。所以这个方法用的少。
传值参数(指针):
优点:用传值参数(指针)回传返回值是最常用的方法,需要哪一个值回传,就定义哪一个变量的指针,用完就把内存收回来了,执行速度快,程序直观,函数的移植性好。
缺点:要熟悉指针的使用,别搞乱套。定义指针,增加了一些工作量。
⑼ C语言问题 怎么看函数是传地址还是传值,这个程序结果为什么不是5,3,5,3
传入的值和地址主要看形参是指针类型还是其它值类型
传出的值可以看return的是什么,也可以看函数类型
比如 :
int*a(intb);
inta(intb);
inta(int*b);
传入传出分别是
值/指针
值/值
指针/值
⑽ C语言 传值 传址 传引用
我来详细解释一下: void test1(int a)
{
a = 100; //这里的a是根据参数a而构造出的一个副本,暂存于栈中,与实际参数a完全处于不同内存。
//当函数退出时,a自动无效,修改a的值只是修改栈中这个a的值,无法修改实参。
//如果使用的是C++传递的是一个类的话,同样需要构造一个副本,函数退出时也会析构
//该副本,因此会加大构造和析构的开销,同时会加大内存开销用于保存临时副本
}void test2(int* a)
{
*a = 1000; //这里的a和传值一样,也是构造的一个副本,不过这个副本是一个指针,同样暂存域栈中
//同样需要加大创建这个指针副本的内存,32位机器为4字节,即存放这个副本用的
//同样与实参a指针处于完全不同的内存
//但是,虽然这两个指针处于不同内存,他们指向的地址却是同一个地址
//我们通过*操作符来解析指针指向的地址的值(简称解引用)
//*a = 5;这句代码的意思是将副本a指向的地址的值改变为5
//由于副本a指向的地址与实参指向的地址相同,即改变了实参指向的地址的值
//因此实参a指向的地址的值变成了5 //可以解释的形象一些,
//假如实参a自身处于内存0x01,它指向地址0x03
//那么这个副本处于的内存不会是0x01(因为它是构造出来的一个副本指针),我们假设它自身地址
//为0x02(只是假设,这个地址值肯定是在栈当中的),而它指向的地址一样是0x03
}void test3(int* a)
{
int tmp;
a = &tmp; //接着test2讲,由于这里的a是一个构造的副本,如果我们改变它,让它指向tmp的地址
//就不会改变实参指向的地址的值,这里只是将副本指向的地址改变了而已 //解释的形象一些,
//同理假设实参a自身内存为0x01,它指向地址0x03
//这里的a的自身内存为0x02,它也指向地址0x03
//tmp地址为0x04
//a = &tmp;这句代码的意思是让a指向tmp的地址,即副本a指向了tmp地址0x04
//而实参a指向的地址的值没有发生任何变化
*a = 10000; //这里对形参a的任何操作已经于实参a毫无任何关系了
//因为它自身地址是0x02,它指向的地址是0x04
}void test4(int& a)
{
a = 100000; //这里的a与实参a完全一样了,在这里对a的任何操作等价于对实参a的操作
}
void main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4; printf("操作前各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d); test1(a);
test2(&b);
test3(&c);
test4(d); printf("操作后各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d);
} 附图: