为什么数组值传递需要一个中间变量指针*p

作者&投稿:商柏 (若有异议请与网页底部的电邮联系)
C语言指针**p是什么意思~

**p表示p也表示地址,简单的说,这个地址对应的存储单元存储的数也是一个地址,而不是数值,而这个被存储的地址对应的存储单元存储的数据才是真正的相应类型的数值!
例如:
int i=10; //定义了一个整型变量
int *p=&i; //定义了一个指针指向这个变量
int **p1=&p; //定义了一个二级指针指向p指针
那么取出10的值方式为:
printf(“i=[%d]
”,*p);
printf(“i=[%d]
”,**p1);

扩展资料:
指针与数组关系
指针数组:就是一个由指针组成的数组,那个数组的各个元素都是指针,指向某个内存地址。 char *p[10];//p是一个指针数组
数组指针:数组名本身就是一个指针,指向数组的首地址。注意这是一个常数。
example:
char (*p)[10]//p是一个数组指针
函数指针:本身是一个指针,指向一个函数入口地址,通过该指针可调用其指向的函数,使用函数指针可实现回调函数。
参考资料来源:百度百科-指针

指针变量p指向一个字符串数组,那么p就保存了这个字符串数组的首地址,*p就是取首地址的内容,即字符串数组的第一个字符

估计楼主直接把代码写成a[i]=*s;了吧……楼主要先了解指针和数组应该怎么用才对。

void  fun (  char  s[], int  n )

{

char  a[80] ;//, *p;

int  i, j = 0; ///////////////////////////// 新增变量j

/**********found***********/

//p=s;

for(i=0; i<n; i++)  a[i]='*';

do

{  a[i]=s[j]; ///////////////////////////// 将s数组赋值给a数组

i++;

}

/**********found***********/

while(s[j++]);  ////////////////////////////判断s数组是否已遍历结束

a[i]=0;

strcpy(s,a);

}


如果楼主想想使用a[i]=*s的方式也是可以的,但是指针p还是不能省,如下代码

void  fun (  char  *s, int  n )

{

char  a[80] , *p;

int  i, j = 0;

/**********found***********/

p=s;

for(i=0; i<n; i++)  a[i]='*';

do

{  a[i]=*s;

i++;

}

/**********found***********/

while(*s++);

a[i]=0;

strcpy(p,a);  ///////这里还是要用p指针

}


关键是“*s++”,这个操作会导致s指针往后偏移了,如果最后不是用p指针而是用s指针,比如strcpy(s,a);  这样会造成把a字符串拷贝到偏移后的s指针缓存中,如图




传递整个数组作为参数时,为什么还需要数组的长度作为参数
传递数组作为参数时只传递了数组在内存中的首地址,但对于数组有多大,必须由数组长度来确定。否则的话函数中对于数组的操作可能会越界,即对原本不属于数组的内存进行了修改,这样可能会导致程序出错。当然,假如你能用其他方法来判断数组的结束地址,比如数组的最后一个元素设为一个特殊值,那么你也可以不...

c++ “数组可以通过值参数和引用参数两种方式传递给函数”的说法对否...
可以说是对,在C++中,数组并不像java那样是对象,C++的数组就是一段内存,值传递,其实是指针传递 当然,C++那么牛B的,肯定支持数组的引用传递了 值传递:void fun(int arr[]);实际上传递的是数组的首地址指针;引用:void fun(int (&arr)[SIZE]);注意,方括号中的SIZE必须要写,而且在调用的...

指针数组 作为参数传递
a是指针数组,元素是char指针 ,数组传递的时候编译器只会传递数组地址,也就是a的地址,是指针数组的地址。进入函数时,复制了份指针数组的地址,而不是数组本身。函数内 char *p="add";\/\/先在常量区放入"add",并将地址赋值给p a[1]=p;将p的值也就是常量字符串的地址赋值给a指向的数组中的...

c#数组是值传递还是引用传递
可以看到,在 `ModifyArray` 方法中更改数组的第二个元素也影响到了原始数组,因为数组传递的是其引用。需要注意的是,即便数组是引用类型,在某些情况下仍然需要使用 ref 或 out 关键字来更改原始数组。例如,在方法内创建一个新数组并将其分配给传递进来的数组变量时,将无法更改原始数组,因为它仍指向...

C++中数组作为参数,有按值传递和按地址传递这两种方式么?
都是传地址.不过地址也是有区别的.传数组名本身, 属于按值传递,即使它是第一个地址值.传递数组地址,或者传递数组引用, 属于传地址.但实际上,由于数组名不许修改值,传地址并没有什么意义.

VB中的数组作为参数值的传递
dimension 可选的;Variant (Long)。指定返回哪一维的下界。1 表示第一维,2 表示第二维,如此类推。如果省略 dimension,就认为是 1。>>说明 LBound 函数与 UBound 函数一起使用,用来确定一个数组的大小。UBound 用来确定数组某一维的上界。>>对具有下述维数的数组而言,LBound 的返回值见下表:Di...

函数调用时传给形参的是数组的什么值?
若用数组名作为函数调用时的实参,则实际上传递给形参的是数组首地址。数组首地址数组第一个元素的地址。数组名字本身就是一个指针,它是一个指针常量,指向的地址不变。比如定义了一个数组变量,编译器就会在内存中划分了一块地址空间给它,数组名这个指针常量就指向了这块内存空间的首地址,而数组首...

【C 语言】数组元素和数组名作为函数参数
3)在变量做函数参数时,所进行的值传递是单向的。即只能从实参传向形参,不能从形参传回实参。1)形参数组和实参数组类型必须一致,否则出错。2)在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。或写为:n 的值由主调函数的实参进行传递。所有的地址都占8个字节。...

值传递和引用传递
值传递和引用传递是两种不同的参数传递方式,C++支持引用传递,而C、Java、Python则主要采用值传递。在C和C++中,当调用函数时,实际上是将实参的值(对于普通变量)或地址(对于指针和数组)复制到函数的参数中。这被称为值传递,意味着函数内部对参数的修改不会影响到原始变量。例如,即使在test函数中...

C语言里可以将数组作为参数,以值的方式传递给函数吗?
如果是只传数组的数值的话,是做不到的。如果传数组中某个值的地址的话,是可以做到的。简单来说:只能以传 数组地址 的方法来实现。

香港特别行政区13847158663: Java中为什么数组之间交换数据要使用中间值 -
地果黄连: 因为输出流System.out是PrintStream对象,PrintStream有多个重载的println方法,其中一个就是publicvoidprintln(char[]x),直接打印字符数组的话,不像int[]等其他数组,它会直接调用这个方法来打印,因而可以打印出数组内容,而不是地址.

香港特别行政区13847158663: C语言中交换X,y的值为什么要用中间变量 -
地果黄连: 如果a=b,b=a的话.结果会变化.例如a=2,b=5 第一步,a=b;//a=5; 第二步,b=a;//b=5; 这样就达不到你要的效果了.那么c的作用就是暂时存放2的. 以后可以长期交流.

香港特别行政区13847158663: C语言值传递和地址传递 不明白 -
地果黄连: 1)void swap(int a, int b)的参数属于值传递;2)值传递需要一个中间变量,以你的程序为例: swap(x,y); 它的实际过程是,先分配两个临时变量,a和b,这两个变量和传入的x、y占用不同的地址空间,程序先将x和y的值复制给a和b: swap(a = x, b ...

香港特别行政区13847158663: c语言中交换两个数据,为什么数组是地址传递捏 -
地果黄连: 如果是不是传地址,那会在函数中重新定义两个变量分别等于两个参数的值,对新定义的两个变量进行操作.和原来的两个变量无关. 如果是传地址,那就是把两个数的地址传到函数中,对两个地址中的内容进行操作.所以会改变两个数的值.一般如果要通过函数来改变参数的值,C都是要用传地址的,C++还可以用引用.比如scanf()函数,因为要把输入的值传递给参数,所以要加取地址符号&.而printf就不用

香港特别行政区13847158663: 在二维数组中怎么交换两个数的值??? -
地果黄连: 设置一个中间变量,先把第一个值给中间变量,然后把第二个值给第一个值,最后把中间变量的给第二个值,这样就交换了.

香港特别行政区13847158663: 数组作为参数传递的是什么? -
地果黄连: 数组作为参数传递的是地址,传递时是将数组的首地址传给相应的参数,接受数组的参数要么一个数组,要么指针类型的变量

香港特别行政区13847158663: 为啥数组在函数中可以使数组的值传递?? -
地果黄连: 你要明白,你传的不是数组,是数组首地址的拷贝.函数在java中叫方法.方法的传值都是值传递,就是将传进来的东西拷贝一份.你传过来一个数组,实际上内存只是创建了数组首地址的拷贝.这个拷贝指向该数组.你vv方...

香港特别行政区13847158663: 数组作为形参和实参之间的值传递 -
地果黄连: 数组作为形参只是一种形式,其实和对应的数据类型指针等价 数组作为实参传递的是地址,并不会传递数组长度信息 在形参中声明数组的大小并没有任何意义,编译器不会解释这个大小,仍然按照指针来处理它.形参出现在函数定义中,...

香港特别行政区13847158663: 传递整个数组作为参数时,为什么还需要数组的长度作为参数 -
地果黄连: 传递数组作为参数时只传递了数组在内存中的首地址,但对于数组有多大,必须由数组长度来确定.否则的话函数中对于数组的操作可能会越界,即对原本不属于数组的内存进行了修改,这样可能会导致程序出错. 当然,假如你能用其他方法来判断数组的结束地址,比如数组的最后一个元素设为一个特殊值,那么你也可以不用传递数组长度.

香港特别行政区13847158663: 请问大家 c++ 数组 传递给函数 -
地果黄连: 第一句话不对,数组是不能通过值传递的,可以用指针或者引用传递. 指针和引用的区别在于是否可以改变,实际上它们都是指针,指针可以改变,但是引用是不能改变的.注意我说的是改变指针本身,而不是指针所指的值,指针所指的值是可...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网