C指针(2)——指针在函数中的应用(程序讲解)

3-1.c指针用作函数参数

#include<stdio.h>
  typedef unsigned char uint8_t;   //类型自定义,通过typedef语句重新把unsigned char命名为uint8_t,目的为了方便
  extern void swapdata(uint8_t dat_x,uint8_t dat_y);
int main(void)
{
  uint8_t x,y;
  printf("请输入x,y:");
  scanf("%d,%d",&x,&y);
  printf("交换前:x=%d,y=%d\n",x,y);
  swapdata(x,y);
  printf("交换后:x=%d,y=%d\n",x,y);
  return 0;
}
  void swapdata(uint8_t dat_x,uint8_t dat_y)
{
  uint8_t temp;
  temp=dat_x;
  dat_x=dat_y;
  dat_y=temp;
}

目的:是为了通过swapdate()函数把实参x,y的值进行交换,上述例子是将形参dat_x,dat_y的值进行交换,但是形参的交换并没有改变实参的交换,因为函数在调用时给形参分配了单独的内存空间,实参的值传递给形参实际是把实参的值放在形参的内存空间,形参的值是实参的备份,因此形参交换,实参并不会交换,不能达到交换实参的目的。 

 结果:

请输入x,y:30,20
交换前:x=30,y=20
交换后:x=30,y=20

3-2 函数调用时,把指针作为函数参数进行传递,即传递变量的地址。在被调函数中,通过指针操作相应的变量,实际操作变量本身。在被调函数中对形参的操作实际就是对实参的操作。

#include <stdio.h>
typedef unsigned char uint8_t;
extern void swapdata(uint8_t *dat_x,uint8_t *dat_y);  //函数参数变成指针
int main(void)
{
  uint8_t x,y;
  uint8_t *p_x,*p_y;
  printf("请输入x,y:");
  scanf("%d,%d",&x,&y);
  p_x=&x;
  p_y=&y;
  printf("交换前:x=%d,y=%d\n",x,y);
  swapdata(p_x,p_y);
  printf("交换后:x=%d,y=%d\n",x,y);
  return 0;
}
  void swapdata(uint8_t *dat_x,uint8_t *dat_y)   //形参为两个指针变量,目的是为了承接实参的值,实参是指针类型,
{
  uint8_t temp;
 temp=*dat_x;    //通过取值运算符*与指针变零dat_x结合,访问实参x;调用swapdate()后,指针变量dat_x指向实参x,对*dat_x的操作实际是对实参x的操作。
 *dat_x=*dat_y;
 *dat_y=temp;
}

 结果:

请输入x,y:10,20
交换前:x=10,y=20
交换后:x=20,y=10

  对比3-1和3-2的根本区别是:前者调用函数,实参是x,y的值;后者调用函数时,实参是x,y的指针,即二者的地址。

结论:要在被调函数中改变主调函数中的变量值,需要将主函数中变量的指针作为实参,传递给被调函数。

 

原文地址:https://www.cnblogs.com/happying30/p/9379465.html

时间: 2024-10-11 11:49:11

C指针(2)——指针在函数中的应用(程序讲解)的相关文章

指针的引用——在函数中的巧妙应用

前面有一篇文章讲了指针与引用.并且还提到不能定义指向引用的指针(因为引用不是对象,没有实际的地址).那么,能否定义指针的引用呢?答案是肯定的,因为指针本身就是一个对象.即然是对象,就能定义一个引用邦定该对象.先来看看指针的引用的用法: 以int类型为例如下: void ReferencePointer() { int i = 5; // 变量i int* p = &i; // 指针p,指向变量i int*& pr = p; // 指针的引用,与p指向同一个变量i cout <<

c++中函数中变量内存分配以及返回指针、引用类型的思考

众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量.指针.引用等等). 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函数中我们自己声明的局部变量. 这样,程序在某些情况下就可能存在一定的问题.看似很简单的问题,通过仔细的分析,我们就能够更好的理解c++中内存分配和释放的问题. 好,废话不多说,我们进入正题.首先,简单介绍一下程序的内存区域的分配: 程序的内存分配 ①堆区(heap).这一部分主要是由程序开发人员自己

如何理解指针的指针?

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Maples7链接:http://www.zhihu.com/question/29180416/answer/50338124来源:知乎 为了提高函数封装性,避免使用全局变量.比如使用链表时,你有一个头结点指针.在某个函数中你需要对头结点指针进行修改,如果只是将头结点指针当成形式参数传进函数,函数里面的参数只是一个对头结点指针的副本,作用域只是在函数内部,在函数里面对它的任何操作不会影响函数外真正的头结点指针.

指针参数--指针做参数时应该注意的地方

转自:http://blog.csdn.net/sszgg2006/article/details/9037675 首先看以下程序: [cpp] view plain copy #include <stdio.h> int *swap(int *px, int *py){ int temp; temp = *px; *px = *py; *py = temp; return px; } int main(void){ int i = 10, j = 20; int *p = swap(&

指针和引用(4)指向指针的指针

1.知识点 (1)在程序中可以声明指向任何数据类型的指针,指针也可以指向指针类型,成为指向指针的指针.下面是一个使用例子 1 int a=10,b=20; 2 int *q=&a; 3 int **p=&q; 4 **p=30; (2)如果想通过指针在被调函数中修改主调函数的变量,必须将主调函变量(务必确定该变量的类型,有时候可能变量本身就是指针,这时候形参就需要是指针的指针了)的地址作为参数,在被调函数中修改主调函数指向的内容. 2.面试题 2.1指针作为参数的常见错误 1 int fi

C语言中的main函数为什么被称作程序入口

以前在学Python时,对于类前的__main__判断有过了解,后来在学习C语言时发现其实都是互通的.所有的程序入口,比如main或者WINmain,在很多编程语言中都以主函数的方式出现.下面为大家整理了一些程序入口的基本概念. 首先,我们的程序进入到入口函数之前,是发生了很多事情的.操作系统的安排,启动运行时库,运行时库再初始化好环境,然后启动你的入口函数,你的程序才正常的运行起来.等你的程序运行结束后,就退回到运行时库,然后再退回到操作系统,然后系统再调度其他程序执行. 在系统把使用权交给我

数组、字符串在指针和函数中的一些经验总结

这篇主要是记录一下今天下午的坑和教训. 1.对于多维数组,在函数原型声明的形式是 void funct(int arr[ ][10]) 或 void funct (int (*arrp)[10]),后面的数字10必须要指定.不能以 void funct( int arr[ ] [ ]) 或 void funct (int **arr)等其他形式来声明带多维数组参数的函数原型. 而数组在首次声明时必须要指定维数,如 int arr[2]; 不能是 int arr[ ].除非是后面带初始化的数,如

编程题:指向函数的指针,求两个数中较大的数。

#include<stdio.h> int max(x,y) { int z; if(x>y)  z=x; else  z=y; return z; } void main() { int a,b,c; int (*p)(); p=max; scanf("%d,%d",&a,&b); c=(*p)(a,b); printf("%d,%d,max is %d\n",a,b,c); } 编程题:指向函数的指针,求两个数中较大的数.,布布

【通过操作指针,与指针做函数參数&amp;#39;实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 由于p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

通过操作指针,与指针做函数参数&#39;实现字串在主串中出现的次数,然后将出现的部分按照要求进行替换

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 因为p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据