使用指针作为函数参数,用指针变量作为函数参数

1,用指针变量作为函数参数指针其实就是地址,例如int a=3;int *p=&a;这时p就是一个指针,它的值就是a在内存中地址,&是取地址的意思,在函数调用中用了指针作形参,那么调用函数时候实参传递给函数的是参数的地址,函数在执行的过程中会根据这个传过来的地址去对那个变量进行运算 。最后会把这个变量的值改变 。用引用也是用地址实现这种传递法 。不用指针变量,则函数在调用时会在内存另外一个地方再开启内存,传递过来的值交给了这个新开启的内存 。函数在执行过程中则只对这部分新开启的内存变量操作,结束后不会返回值,所以,指针变量其实就是通过地址来改变主函数中变量值
2,指针变量作为函数参数传递的是指针的地址 。例如,一个整形指针,假设其地址为0x0001 , 则形参的变量地址也是0x0001,即使用同一个内存地址 。举个例子易于理解void function ( int* n );//函数的声明 int a=8;int* aPtr=&a;function(aPtr);以上调用function这个函数时,函数内部会生成一个类型为(int*)的参数n,它被赋予aPtr(即a的地址),因此它只是aPtr的一个副本,并非aPtr.若想要在函数中直接使用aPtr,而不是用其副本 , 则你可将函数声明改为void function ( int* &n );这样在函数体中n其实就是aPtr的别名,不暂用额外空间.懂没?指针其实就是地址,例如int a=3;int *p=&a;这时p就是一个指针,它的值就是a在内存中地址,&是取地址的意思,在函数调用中用了指针作形参,那么调用函数时候实参传递给函数的是参数的地址 , 函数在执行的过程中会根据这个传过来的地址去对那个变量进行运算 。最后会把这个变量的值改变 。用引用也是用地址实现这种传递法 。不用指针变量,则函数在调用时会在内存另外一个地方再开启内存,传递过来的值交给了这个新开启的内存 。函数在执行过程中则只对这部分新开启的内存变量操作,结束后不会返回值 , 所以,指针变量其实就是通过地址来改变主函数中变量值
3,二维数组使用指针变量做函数参数是什么意思 在什么情况下函数参如果将二维数组作为参数传递给函数 , 那么在函数的参数声明中必须指明数组的列数,行数可以指定也可以不指定 。因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组 。所以如果定义一个函数 , 参数二维数组,那么至少要指定列数,比如:void p (int a[2][3])//正确void p (int a[][3])//正确void p (int a[][])//错误void p (int a[2][])//错误那么如果你想要用指针来做参数传递二维数组,那你需要定义一个指向数组(大小等于二维数组列数)的指针,比如:void p (int (*a)[3])//正确注意:要加括号 , 如果写int *a[3],就只是一维指针数组 。我写了个简单案例:#include <stdio.h>void p(char (*num)[4]) printf("%s\n",num[0]); printf("%s\n",num[1]);}void p2(char num[][4]) printf("%s\n",num[0]); printf("%s\n",num[1]);}int main() char num[2][4]= p(num); p2(num); return 0;}你有一个二维数组a[8][8],你想对这64组数进行处理,均-1.用函数怎么实现?实参a[0][0],a[0][1],a[0][2].......88个实参?形参也是88个?只改了形参,实参没影响?这时,只需要把二维数组的首地址指针当作参数,函数中形参指针一项项移动是不是很好?是的【使用指针作为函数参数,用指针变量作为函数参数】
4 , 指向结构体的指针做函数参数把结构定义拿到程序体外 。#include "stdafx.h"struct personchar name[20];int age;char number[20];}*ptr,per[3]=void output(struct person *p)printf("Name:%s\nAge:%d\nNumber:%s\n",p->name,p->age,p->number);}int _tmain(int argc, _TCHAR* argv[])ptr=per;for(;ptr<per+3;ptr++)output(ptr);}return 0;}#include <stdio.h>struct person char name[20]; int age; char number[20]; }*ptr,per[3]=void output(struct person *p) printf("Name:%s\nAge:%d\nNumber:%s\n",p->name,p->age,p->number);}int main(int argc, char* argv[]) ptr=per; for(;ptr<per+3;ptr++)output(ptr); } return 0;}将结构体的定义和赋值操作都放到函数外边即可 。你把结构体 定义在函数里了 放到函数定义外面去 就可以了#include "stdafx.h"#include <stdio.h>struct person//person定义在这里,要在output()前面,要不然output()不知道person char name[20]; int age; char number[20];}*ptr,per[3]=void output(struct person *p) printf("Name:%s\nAge:%d\nNumber:%s\n",p->name,p->age,p->number);}int _tmain(int argc, _TCHAR* argv[]) ptr=per; for(;ptr<per+3;ptr++)output(ptr); } return 0;}typedef struct tagstruct.......}struct,*lpstruct;void fun(lpstruct pstruct1,lpstruct pstruct2,lpstruct pstruct3)....}#include "stdafx.h"#include <stdio.h> struct person //person定义在这里 , 要在output()前面,要不然output()不知道personchar name[20];int age;char number[20];}*ptr,per[3]=void output(struct person *p)printf("Name:%s\nAge:%d\nNumber:%s\n",p->name,p->age,p->number);}int _tmain(int argc, _TCHAR* argv[])ptr=per;for(;ptr<per+3;ptr++)output(ptr);}return 0;}5,怎样用函数指针做参数1:形参调用的只是临时的一些值,而指针传递的是地址,参数的地址是随程序运行一直存在的,所以改变该地址下的值对主函数里也是有影响的 。2:形参的调用是临时的,也就是说形参的地址也是临时新分配出来的 , 所以新分配的地址与主函数里的地址没有联系,实参的值不会受到影响补充:形参在申明的时候,括号中的东西(int a, *p)无论是什么样的形式,都会新分配地址,然后传入形参 。所以 实参和形参在内存中是分两个地方储存的 , 就算是值一样的时候,也不是占同一处内存 。故形参无法 影响实参函数的指针可以作为一个参数传递给另外一个函数,这一点非常有意思 。一个函数用函数指针作参数,意味着这个函数的一部分工作需要通过函数指针调用另外的函数来完成,这被称为“回调(callback)” 。处理图形用户接口的许多C库函数都用函数指针作参数,因为创建显示风格的工作可以由这些函数本身完成,但确定显示内容的工作需要由应用程序完成 。举一个简单的例子,假设有一个由字符指针组成的数组,你想按这些指针指向的字符串的值对这些指针进行排序,你可以使用qsort()函数,而qsort()函数需要借助函数指针来完成这项任务(关于排序的详细介绍请参见第3章“排序和查找” 。qsort()函数有4个参数:(1) 指向数组开头的指针;(2) 数组中的元素数目;(3) 数组中每个元素的大?。?(4) 指向一个比较函数的指针 。qsort()函数返回一个整型值 。比较函数有两个参数,分别为指向要比较的两个元素的指针 。当要比较的第一个元素大于、等于或小于第二个元素时,比较函数分别返回一个大于o,等于 。或小于 。的值 。排序算法和交换算法都是qsort()函数的部分内容 。qsort()函数的交换算法代码只负责拷贝指定数目的字节(可能调用memcpy()或memmove()函数) , 因此qsort()函数不知道要对什么样的数据进行排序,也就不知道如何比较这些数据 。比较数据的工作将由函数指针所指向的比较函数来完成 。对本例来说 , 不能直接用strcmp()函数作比较函数,其原因有两点:第一,strcmp()函数的类型与本例不符(见下文中的介绍);第二,srtcmp()函数不能直接对本例起作用 。strcmp()函数的两个参数都是字符指针,它们都被strcmp()函数看作是字符串中的第一个字符;本例要处理的是字符指针(char *s),因此比较函数的两个参数必须都是指向字符指针的指针 。为什么不能直接将strcmp()函数传递给qsort()函数呢?为什么strpcmp()函数中的参数是如此一种形式呢?因为函数指针的类型是由它所指向的函数的返回值类型及其参数的数目和类型共同决定的,而qsort()函数要求比较函数含两个const void *类型的参数:qsort()函数不知道要对什么样的数据进行排序,因此,base参数和比较函数中的两个参数都是void指针 。这一点很容易理解,因为任何指针都能被转换成void指针,并且不需要强制转换 。但是,qsort()函数对函数指针参数的类型要求就苛刻一些了 。本例要排序的是一个字符指针数组,尽管strcmp()函数的比较算法与此相符,但其参数的类型与此不符,所以在本例中strcmp()函数不能直接被传给qsort()函数 。在这种情况下,最简单和最安全的方法是将一个参数类型符合qsort()函数的要求的比较函数传给qsort()函数 , 而将比较函数的参数强制转换成strcmp()函数所要求的类型后再传给strcmp()函数;strpcmp()函数的作用正是如此 。不管是强制转换strpcmp()函数的参数的类型,还是强制转换指向strcmp()函数的指针的类型 , 你都必须小心进行,因为稍有疏忽,就会使程序出错 。在实际编程中,转换函数指针的类型更容易使程序出错 。#include <stdio.h>void func_callback(int *arg) *arg = 54;}int func(int a, void (*callback)(int *)) int b; callback(&b); return b + a;}int main() int c =func(34,func_callback); printf("%d\n",c); return 0;}func是一个返回int类型的函数,它的参数callback是函数指针 。函数指针作参数时,函数指针的参数只有类型 , 这里是一个指向int类型的指针int fun(int* a,int* b)这样就是用指针做参数 。#include<stdio.h>int gloabl;typedef void *(*a)(int);void *print(int a) printf("%d\n",a);}void *handle(int a) printf("%d\n",a); return &print;}void *func(void *(*handle)(int a),int argument)printf("11\n");return (a)handle(argument);} int main(void) ((a)func(&handle,22))(33); return 0;}我自己写的,不会问我

    推荐阅读