黑马程序员-利用swap函数研究C的指针

设计3个函数,分别实现已下功能:

  • 交换两个整数
  • 交换两个整形指针
  • 交换任意两个同类型的变量
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 void swap_int(int* pa, int* qa) //交换两个整数
 5 {
 6     int temp = *pa;
 7     *pa = *qa;
 8     *qa = temp;
 9 }
10
11
12 void swap_intpur(int** ppa,int** qqa) //交换两个整形指针
13 {
14     int* temp = *ppa;
15     *ppa = *qqa;
16     *qqa = temp;
17 }
18
19 void swap_any(void* a, void* b, size_t len) //交换任意两个同类型的变量
20 {
21    void* temp = malloc(len);
22    memcpy(temp, a, len); //内存拷贝函数
23    memcpy(a, b, len);
24    memcpy(b, temp, len);
25 }
26
27 int main()
28 {
29     int a = 4, b = 3;
30     int* p = &a , * q = &b;
31     printf("Origin a=%d, b=%d\n",a,b);
32     swap_int(&a,&b);
33     printf("After swap_int, a=%d, b=%d\n",a,b);
34     swap_intpur(&p,&q);
35     printf("After swap_intpur, a=%d, b=%d\n",*p,*q);
36     swap_any((void*)&a,(void*)&b,sizeof(a)); //将a和b的内存地址指针强行转换为未确定类型的指针传入函数中
37     printf("After swap_any, a=%d, b=%d\n",a,b);
38     return 0;
39
40 }
  • 实现交换两个整数

在C语言中,所有函数参数都是“通过值”传递的,也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中,所以被调用的函数不能直接修改主调函数中的变量的值。此时我们将主函数中两变量的内存地址传递给被调用函数,虽然这个地址是存放在临时变量里,但我们在调用的函数中将这地址中的内容调换,从而达到交换主函数中两整数变量的值的目的。

  • 实现交换两个整形指针

同样,我们并不能直接交换连个整形指针,同样是将两个整形指针的地址传入被调用的函数中,交换方式和第一个函数类似。但此时注意的是,我们是将p指针和q指针的地址传入被调用函数,所以在函数swap_intpur的*ppa中存放指针p,所以我们需要用一个指针变量作为缓冲变量,即此时我们用* temp而不是temp。

  • 实现交换任意两个同类项的变量

不同类型的变量,在内存中的存储长度是不同的,所以我们为应对任意变量,在传递变量的同时也要传递变量的储存长度。因为传递的长度并不确定,所以我们在swap_any中对len的类型申明采用size_t,以确保其大小足以保证存储内存中对象的大小。在调用此函数时也是利用sizeof获取传入变量的长度。

malloc函数的作用是向系统申请分配指定size个字节的内存空间,利用这一函数我们就可以确定缓冲变量的长度。最后利用memcp函数,其作用是内存拷贝,即从源所指的内存地址的起始位置开始拷贝n个字节到目标所指的内存地址的起始位置中。

总结

指针:指向一块内存的起始位置,指针的类型决定了这块内存的大小。

时间: 2024-08-01 22:45:28

黑马程序员-利用swap函数研究C的指针的相关文章

【黑马程序员】————scanf函数

变量的内存分析 1.内存寻址由大到小,优先分配内存地址比较大的字节给变量 2.变量越先定义,内存地址就越大 3.取得变量的地址:&变量名 4.输出地址:%p 5.一个变量一定先进行初始化,才能使用 查看内存地址: int a;printf("a的地址是:%p\n", &a); scanf函数 1.      简介 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,

黑马程序员_IOS开发_Objective-C学习笔记_指针复习

1.指针 上一篇我在分析我自己写的程序错误里面发现是指针的问题,我觉得有必要在复习一下指针,毕竟指针是C语言系列的难点. 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移对指针的概念和使用越加模糊,感觉指针难以掌握,今天我就再回顾下指针的概念和使用. 2.什么是指针 指针的本质是存放变量地址的变量,简单的说变量p中存储的是变量a的地址,那么p就可以称为是变量a的指针,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对

黑马程序员——C语言——函数

主要讲述了函数的定义,使用.形参.实参以及返回值等内容. 一.函数. 一个程序包括一个或者多个程序段(小程序),每个程序段都有自己的功能,我们一般称这些程序段为“函数” 二.函数的定义 1.定义函数 ① 定义函数名:   ②定义函数体: 2. 定义函数的格式 返回值类型  函数名(形式参数列表) { 函数体 } 代码举例 1 //定义一个函数,计算两个整数的和 2 int sum(int a, int b) 3 { 4 int c = a + b; 5 } 三.函数的参数 1.形式参数:定义函数

黑马程序员——java基础--函数

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一:函数 1.函数定义 2.函数格式 3.函数作用 a.什么叫做函数呢? 就是一段具有特殊作用的代码段. b.函数的格式 修饰符 返回类型 函数名(变量列表)  //变量列表包括变量类型和变量个数 { 代码 return ; } c.为什么要使用函数? 提高程序的复用性,提高效率,正所谓有需求才会出现. d.函数适合哪些场合使用? 当一个功能要重复使用的时候,函数就显得格外有效率. e.如何定

黑马程序员—C语言函数的学习

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲  函数的参数问题以及返回值 在定义函数的参数时要注意以下几点: 1.形式参数:定义函数时函数名后面中的参数,简称形参 2.实际参数:调用函数时传入的具体数据,简称实参 3.实参个数必须等于形参个数 4.如果是基本数据类型作为函数的形参,纯粹是值传递,修改函数内部形参的值,并不会影响外面实参的值 5.一个函数可以没有形参,也可以有无数个 下面通过一个具体的例子来看一下函数的具体使用以及参

黑马程序员--c基础--指针

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.指针的定义: 数据类型 *指针变量名 2.指针的赋值:指针变量名=&... 或者 指针变量名 =数组名 注意:定义的时候 * 仅代表这是在定义一个指针变量,没有其他的意义 eg. int main() { int *p;//定义指针变量 int a=10; p=&a;//给指针变量赋值,给的是变量a的地址符 printf("%d",*p);//获取指针变量的值 }

黑马程序员—C语言的函数、数组、字符串

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参数名, ... ) {               语句;             return ...         } 3.函数的分类: 根据参数分可以分为  1.有参数函数,2.无参数函           根据返回值分可以分为 1.有返回值函数  2.无返回值函数 4.下面我举一个简单的有

黑马程序员_ 利用oc的协议实现代理模式

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用. 在看过李明杰老师的课程后,我对代理模式有了最初步的理解,虽然还很浅显 但是也明白了代理模式的 一些作用跟用法.首先使用代理模式可以降低耦合度.大大的增强了代码的弹性. 举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票 最简单的方式就是 建立一个person类(小明) 一个agent类(代理类) ag

黑马程序员——c语言学习心得——函数传递二维数组

黑马程序员——c语言学习心得——函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.   变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯.尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问.那么如何初始化指针变量呢,一般有以下几种方法:   1.初始化空指针   int* pInteger=N