精华内容
下载资源
问答
  • C语言中的指针与数组@(C语言)[排序算法, 快速排序, C实现]引言相信指针与数组是不少同学在初学C语言时遇见的大魔王。指针的的概念弄不清,导致程序写起来极易出错, 我遇见的运行错误有九成都是指针使用不当导致的,...

    C语言中的指针与数组

    @(C语言)[排序算法, 快速排序, C实现]

    引言

    相信指针与数组是不少同学在初学C语言时遇见的大魔王。指针的的概念弄不清,导致程序写起来极易出错, 我遇见的运行错误有九成都是指针使用不当导致的,可以说,指针与数组是在学习C语言的道路上,必须击败的一个小BOSS。

    //注:本文中可能有部分词汇初学者不明白其含义,没有关系的,这些不会造成您阅读本博文的障碍,网上搜一下含义,大致理解它的意思即可。

    指针

    指针的概念

    指针是一种特殊的变量类型,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元,因而得名叫指针。

    举个例子,我们现在知道存储单元中有一个变量 a,知道他的值,但假如我们不知道他在存储单元里的位置,那我们将无法改变这个变量的值。但是,我们现在申请了一个特殊的变量,他可以储存 a 的地址,获取到 a 的地址之后,我们就可以找到它在内存中的位置,就可以更改内存变量的值了。当然,这只是个例子,只是为了方便大家理解指针的含义而已,在C语言中,变量会在它的作用域中保留它的地址,直接用个取址符&就可获取其地址。

    指针用法举例

    指针的声明格式如下:

    [变量类型] * [指针名称]

    例如:int * p;

    下面展示一个指针运用的程序

    #include

    int main()

    {

    int a = 10;//声明一个int变量

    int *p = &a;//声明一个指针,指向变量a

    //int *p = a;//注意,这行是错误的,不能直接将int型赋值给指针变量

    //在定义了指针之后,在指针变量前加一个*,即代表的是p所指的变量

    printf("a的值为%d,*p的值为%d\n",a,*p);

    return 0;

    }

    程序输出的结果为:a的值为10,p的值为10

    可见:

    1.不能直接将int型变量赋值给指针变量

    2.在定义了指针之后,在指针变量前加一个,即代表的是p所指的变量

    第一点很容易理解,指针作为储存地址的特殊变量,自然不能存储普通变量类型的值,只可以赋值给它地址作为值,也就是我们所谓的指向这个变量。

    第二点是取值符 * 的演示:即 * p 的表达式等价于 a 的表达式。注意很多同学会把定义指针时的 * 和取值符 * 弄混,其实它们两个并无联系。

    函数间的指针传参

    上面提到过变量在它的作用域中可以直接通过取址符获得变量在内存中的地址,但如果是函数间传参的话,这个方法就不得行了。

    举个例子

    #include

    void test(int a)

    {

    a=11;

    }

    int main()

    {

    int a=10;

    test(a);

    printf("a=%d\n",a);

    return 0;

    }

    输出的结果:a=10

    可见,test函数并没能做到改变a的值。其实原因很简单,传参数a,传的只是参数a的数值,并不是它的地址。在函数test中,并不知道a的地址为多少,自然也就无法更改a的值(test中的变量a是个型参,与main中的a不同)。

    那我们该如何解决这个问题呢?这时,指针的作用就来了!

    #include

    void test(int *p)

    {

    *p=11;

    }

    int main()

    {

    int a=10;

    test(&a);

    printf("a=%d\n",a);

    return 0;

    }

    输出的结果:a=11

    可见,如果把a的地址作为指针传过去,test函数就有办法通过指针来修改a的值了,是不是很有趣呢?

    数组

    数组的概念

    所谓数组,是相同数据类型的元素按一定顺序排列的集合。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

    数组运用举例

    在C语言中,数组的定义形式为 [变量类型] [数组名称][]

    例如:int a[];

    举个栗子,假如我现在要从10个数中选择最大的一个数输出,该怎么编码?

    如果我们不会用数组的话,我们就要定义10个变量了,哦,想想都麻烦死了。。。

    闲聊:还记得我刚学习C语言时,计算机导论老师叫我写一个8个数的排序,我就真的定义了8个变量,最后把老师笑死了(计算机导论老师不知道我们当时还没学数组)

    #include

    int max(int a,int b)//比较大小函数

    {

    return a>b?a:b;

    }

    int main()

    {

    int a[10]={6,7,3,9,1,0,6,5,10,4};//待处理的10个数

    int ans = a[0];//作为答案的变量

    int i;

    for(i=1;i<10;i++)

    {

    ans=max(ans,a[i]);//依次比较大小,保留较小的

    }

    printf("Max = %d\n",ans);

    return 0;

    }

    运行的结果:Max = 10

    可见,运用数组的话,能大大提高我们编程的效率,不用傻傻地定义10个变量了

    数组与指针的关系

    其实说白了,数组就是运用了指针的思想来构建的。

    数组其实就是在内存中申请一段连续的内存单元,然后再把这一段内存单元的首单元的地址储存起来,就构成了数组。比如我们要找到a[6],计算机先找到数组a的首地址,然后再向后移动6个单元格,就是我们要找的a[6]了。

    举个例子

    #include

    int main()

    {

    int a[10];

    printf("数组a的首地址:a=%x\n a[0]的地址为:&a[0]=%x\n a[6]的地址为:&a[6]=%x\n",a,&a[0],&a[6]);

    return 0;

    }

    输出的结果:

    数组a的首地址:a=5fbff7c0

    a[0]的地址为:&a[0]=5fbff7c0

    a[6]的地址为:&a[6]=5fbff7d8

    注:%x为16进制输出

    可见,a的地址和a[0]的地址是一样的,可见数组名a的实质,其实就是指向数组a首地址的指针

    二维数组

    二维数组其实就是有两个维度的数组

    例如 int a[10][10];

    类似的,还有三维数组,四位数组。

    举个例子:

    #include

    int main()

    {

    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

    //假设第一个维度代表的是行,第二个维度代表的是列

    //我们想知道第2行,第三列的数据就直接用a[1][2]就可以了

    printf("a[1][2]=%d\n",a[1][2]);

    return 0;

    }

    输出的结果:a[1][2]=6

    注:C语言中的序列都是从0开始数

    因为这篇博文主要是讲的指针与数组的关系,所以二维数组的概念就点到为止吧

    总结

    这么看起来,其实指针和数组还是挺简单的对吧?只要理解了它的概念,并多敲代码,就能做到熟练的运用它们。

    注:未经作者允许,请勿私自转载博文。

    参考资料:百度百科(指针和数组的概念)

    展开全文
  • 2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 ...
  • 2.4 怎样表示一个算法 24 2.4.1 用自然语言表示算法 24 2.4.2 用流程图表示算法 24 2.4.3 三种基本结构和改进的流程图 28 2.4.4 用N-S 流程图表示算法 29 2.4.5 用伪代码表示算法 30 2.4.6 用计算机语言表示算法 31 ...
  •  11.1.3 用函数指针实现回调函数  11.1.4 将函数指针应用到STL算法中  11.2 函数对象  11.2.1 定义一个函数对象  11.2.2 利用函数对象记住状态数据  11.3 用Lambda表达式编写更简单的函数  11.3.1 最简单直接...
  • 153_结构体3_怎样使用结构体变量概述 152_结构体2_如何定义结构体[3种方式] 151_结构体1_为什么需要结构体 什么叫结构体【重点】 150_指针_30_跨函数使用内存习题测试【重点】 149_指针_29_动态内存可以跨函数使用...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0041 如何实现数据加密与解密算法 27 0042 如何继承父类的方法 27 0043 如何实现函数重载 28 0044 类中多态的应用 28 0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 ...
  • 0041 如何实现数据加密与解密算法 27 0042 如何继承父类的方法 27 0043 如何实现函数重载 28 0044 类中多态的应用 28 0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 ...
  • 0041 如何实现数据加密与解密算法 27 0042 如何继承父类的方法 27 0043 如何实现函数重载 28 0044 类中多态的应用 28 0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 ...
  • 0041 如何实现数据加密与解密算法 27 0042 如何继承父类的方法 27 0043 如何实现函数重载 28 0044 类中多态的应用 28 0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 ...
  • 0041 如何实现数据加密与解密算法 27 0042 如何继承父类的方法 27 0043 如何实现函数重载 28 0044 类中多态的应用 28 0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 ...
  • 0041 如何实现数据加密与解密算法 27 0042 如何继承父类的方法 27 0043 如何实现函数重载 28 0044 类中多态的应用 28 0045 将函数作为参数进行调用 30 2.3 参数与指针 30 0046 通过指针读写数据 30 ...
  • 面试题86 如何使用指针操作数组 面试题87 const对象的指针和const指针的区别 面试题88 数组指针与指针数组的区别 8.2 函数指针 8.2 函数指针 面试题89 什么是函数指针?如何使用函数指针 面试题90 指针函数和函数...
  • Java程序员面试宝典pdf

    热门讨论 2013-02-21 13:06:13
    面试题168 用Java实现一个快速排序算法 309 15.2 高级编程试题 311 面试题169 怎样实现Singleton(单例)模式编程 311 面试题170 怎样实现简单工厂模式编程 313 面试题171 怎样实现工厂方法模式编程 315 面试题172 ...
  • 面试题168 用Java实现一个快速排序算法 309 15.2 高级编程试题 311 面试题169 怎样实现Singleton(单例)模式编程 311 面试题170 怎样实现简单工厂模式编程 313 面试题171 怎样实现工厂方法模式编程 315 面试题...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题86 如何使用指针操作数组 90 面试题87 const对象的指针和const指针的区别 91 面试题88 数组指针与指针数组的区别 92 8.2 函数指针 93 面试题89 什么是函数指针?如何使用函数指针 93 面试题90 指针函数和函数...
  • 摩托罗拉C++面试题

    2009-08-19 19:52:41
    可以方便容易地实现搜索数据或对数据排序等一系列的算法; 调试程序时更加安全和方便; 即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。 vector实质上就是一个动态数组,会根据...
  • 排序法都有哪些,其算法都是怎样的 如何将十进制字符串、十六进制字符串和二进制字符串互相转化 如何随机选号 第15章 发布程序 如何给软件加密和解密 如何使程序在开机时就自动运行 如何创建快捷方式 如何删除快捷...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    (4)同一个算法实现语言的级别越高,执行效率就越低 A.(1) B.(1),(2) C.(1),(4) D.(3) 7.从逻辑上可以把数据结构分为(C )两大类。【武汉交通科技大学 1996 一 、4(2分)】 A.动态结构、静态结构 B.顺序...
  • ButterKnife 是怎样实现代码注入的 ButterKnife是如何在编译时生成代码的? Dagger 2 预备知识 @Inject @Module @Singleton @Providers @Component @Scope @Qualifier dependencies @SubComponent 简单...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 ...
  • 实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 ...
  • 实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 ...
  • 实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 ...
  • 实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 3.10 ...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 3.10 ...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 3.10 ...
  • 实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 3.10 ...
  • 实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 3.10 ...
  • 实例114 使用Timer组件实现奥运倒计时 167 3.8 ServiceController组件 169 实例115 使用ServiceController组件控制计算机的服务 169 3.9 ImageList组件 171 实例116 使用ImageList组件制作动画图片 171 3.10 ...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

怎样使用指针实现排序算法