c语言指针形参,c语言指针作形参问题

1 , c语言指针作形参问题问题在 &(++(*idx)) 这里++(*idx) 是一个不能放在等号左边的东西(Lvalue就是能放在左边的)---既然楼主做了补充……不同编译器的语法不太一样,但是楼主写 &(++(*idx)) 即使编译通过了也不会有想要的结果的,因为 ++(*idx) 是一个临时变量,无论怎么改它 idx 指向的数据也不会变 。1.指针作为函数形参 可以 没有返回值 。2.定义的void函数 , 无论带不带指针作型参都不会报错 。你的是其他错误,尝试去读编译器查的错 。你可以把你写的程序发出来,大家看看就很了然了 。
2,c语言 形参的表示种类不能写成*x[] 或 *x[10]这两个都表示指向数组的指针 x[]和*x可以表示为数组 你的参数需要的就是数组实际传得是数组的首地址!这个肯定是没有影响的因为在声明部分,编译器只获取的是形参的类型,而不关心它的名字,声明的作用只是为了便于给你定义的函数分配空间 , 所以只需要获取形参的类型就行了而在定义部分,形参就转变了它的意义(向实的方向转换了),它必须要接收调用者传递来的参数(可以理解为简单的赋值,其实也就是这么一回事),然后在自身函数中对形参进行处理,这样,并不会影响实参的值 , 因为它们本身就不是同一个变量至于楼主最后的问题,上面已经解释了,编译器在编译的时候并不会关心声明部分形参的名字,所以,你写于不写都是没有关系的,更何况一样不一样了应该这么写 ,  double fun(double x[], int n) //n是数组大小 或者 double fun(double *x, int n) //n是大小,x是数组不能像你那么写!编译通不过
3,大一c语言题目形参实参与指针的问题首先理解值传递和地址传递的区别 。第二个程序就是值传递 。实参a的值传给形参x,实参b的值传给形参y 。这里的x与a只是值相等了 , 但是两个不同的内存单元 。好比一班和二班两位同学,只是名字都叫张三,却是两个不同的人 。同理,b和y也类似于一班和二班另两位同学,只是名字都叫李四,却是不同的两人 。在swap函数中,只是对x和y操作,类似于只是二班的张三和李四发生了点变化 。他们的变化是不会影响一班的张三和李四的 。所以x和y的变化不会影响a和b 。因为这是四个不同的内存单元 。第一个程序是地址传递 。实参&a(a的地址)传给形参x,实参&b(b的地址)传给形参y 。这样的话,x就指向了a , y也指向了b 。代码中temp=*x;就等价于temp=a;了 。同理,*x=*y; 等价于a=b;*y=temp;等价于b=temp;。这里对*x和*y操作,实际上就是对a和b的操作 。所以会影响a和b的值 。函数形参一定要传递地址,调用过程中改变形参的值,不会影响实参变量本身,实参变量保持值不变,下面的写法输出的形参值不会改变 。上面写法形参值改变实参 。第二个交换了x和y,对a和b没有影响,因为形参和实参的内存地址是不一样的第一个交换了a和b的地址所指向的内容 , 所以交换有效C语言使用的是值传递,仅仅将实参的值传递给形参 。对于第一种写法main函数传递给Swap函数的是&a和&b的值,即a和b所在的地址的值那么Swap函数里面通过*x来更改的就是&a所在的地址里面的值,也就是a本身的值了,所以第一种写法main函数调用Swap函数之后 , a和b的值会发生互换 。对于第二种写法main函数传递给Swap函数的是a和b的值,即只是将15和8传递给了Swap函数那么Swap函数里面更改15和8 , 和main函数的a和b没有啥关系的,所以第二种写法main函数调用Swap函数之后,a和b的值不会发生互换 。Swap函数只是更改了x和y的值,对a和b没有什么影响这就是C语言参数的值传递的奇妙之处了 。【c语言指针形参,c语言指针作形参问题】
4 , C语言问题有关于指针和实参形参(1)形参中定义int *a是表示地址,所以不会出错(2)如果放在main()下面在main()中调用时必须先声明#include <stdio.h>main()int x=50; void test();test(&x);printf("%d\n",x);}void test(int *a)*a=*a+50;}这程序是你写的吗?要是你写的话你就看下面的三段话就能找出 。1. 比如你定义一个函数void add(int a, int b),这里的a和b就是形参 。2. 当你进行函数调用的时候 , add(1, 2),这里的1和2就是实参 。3.形参就是没有赋值的变量 , 实参就是有赋值的变量1.你对形参理解有误,可以大致认为形参是实参的赋值,int *a = &x;2.标准C认为函数需要有原型说明,当test在main前时 , 定义起到了原型说明的作用,放到main后面,需要在main之前增加原型说明 void test(int *a);即:void test(int *a);main()int x=50;test(&x);printf("%d\n",x);}主程序中的函数调用好比是说:把我指的数据操作一下,参数给的是变量地址;子程序中是:你指的数加50,将给出地址指向的数据加50,参数中的int *a表示a是个地址指向一个整型数,int *是修饰a的类型,而程序中的*a表示a所指向的数据;如果你将函数写到main函数之后,你在main中的test(&x);调用,编译程序就不知道调用规则了,你得在这个调用之前告诉编译程序该函数调用规则,一般是在main函数之前写个函数头void test(int *a);在子程序已经放在调用语句之前的情况下就可以省略这个函数头了 。传参有几个方式,一个是单向的,一个是双向的单向的不用多说吧双向的有两种方式,一个是全局变量,这个也不多说一个是地址,也就是传递一个地址过去c的参数有一个共同的特点,就是影子,并且需要新申请内存地址,不在一个内存地址中,那么子函数是无法改变主函数中的数据的子函数不可能改变这个地址的值,但是可以改变这个地址指向的内存空间中的内容,因为这个指向的地址中的内容不是参数但是有一个例外,就是&,其实很好理解改变的也不是这个地址,而是这个地址中的数据,这样明白吗?5,c语言中指针作为形参代码如下你要用*去解引用,这样才能改变指针指向内存的值 。你的swap函数写的有问题,正确的写法有人给了 。至于为什么*x,*y的值没有改变,因为你交换的是2个形参的值,虽然你传入的是指针,但是你没有把它们当成指针来用,最后的结果跟传非指针值是一样的 。如果想真正改变实参的值,就必须交换指针指向的内存,而不是单纯交换指针变量本身 。形参是通过堆栈传递的,只有用类似 *x = 1;这样的语句操作指针指向的内存 , 才能影响到实参 , 否则实参的值是不会改变的 。其实最好的方式就是去VS里调试运行,仔细观察运行过程,就能比较清晰地了解指针 。单纯的理论是站不住脚的,拉出来溜溜就一清二楚了 。想对你能有帮助 。#include<stdio.h>void swop(int *x, int *y)int *t = NULL;t = x;x=y;y= t;printf("%d\n",x);printf("%d\n",y);}int main(void)int a = 3;int b = 4;int *x = &a;int *y = &b;printf("%d\n",x);printf("%d\n",y);swop(x,y);printf("%d\n",x);printf("%d\n",y);printf("%d%d",*x,*y);}拿去试试你就知道了,为什么了,注意观察内存地址的变化swap函数接收的只不过是原先x y中的内容,而这个内容,就是 3,4 的地址,对吧swap将得到的地址进行交换,swap函数在栈上执行 , 执行完就销毁了,不会影响到真正的3 和4,你再看看这个 , 传过去的是x,y的地址 , swap就能通过这个x y的地址找到 3 4的地址,这样就能真正的操作到3 4 了#include<stdio.h>void swop(int **x, int **y)int *t = NULL;t = *x;*x=*y;*y= t;printf("%d\n",x);printf("%d\n",y);}int main(void)int a = 3;int b = 4;int *x = &a;int *y = &b;printf("%d\n",x);printf("%d\n",y);swop(&x,&y);printf("%d\n",x);printf("%d\n",y);printf("%d%d",*x,*y);}一楼的解释更加清楚明白#include<stdio.h> void swop(int *x, int *y) int t; t = *x; *x = *y; *y = t; } int main(void) int a = 3; int b = 4; int *x = &a; int *y = &b; swop(x,y); printf("%d %d",*x,*y); return 0; } 你的交换函数有问题,首先交换顺序就错了 , 指针传递的是地址,t 要是值 , 才能将指针指向地址所代表的值进行交换首先,void swop(int *x, int *y)传进是指针没错 , 但是,参数你可以这样理解,int* 是类型 x,y 是参数,所以是传进swop的还是 x,y (x,y其实是数据所在的地址),亦是说,swop函数里交换你可以将x y 地址指向的数据交换(t = *x ;*x=*y;*y=t ),但就不能交换 x,y 本身 。说得不清楚,写个例子吧int add(int a,int b) 与int add(int * a, int *b);这两者的参数类型是 int 与 int *既然 第一个int add(int a,int b) 里的 a b 不能修改,那么 第二个int add(int * a, int *b)里的 a b 也肯定不能修改的咯

    推荐阅读