c语言指针的应用

C解析之四指针 

 
      前言:C指针可以这么学。
           在很多初学者而言, C/C++指针是一场灾难。C作为底层编程语言的首选,得益于其灵活的指针,使程序员在极大程度上可以直接操控内存,这在比如操作系统的实现上显得必不可少。然而过于灵活的指针有着让人担忧的另一面,不当的使用指针访问未定义空间引发不可知错误,篡改系统安全空间导致系统瘫痪等隐患,犹如挥之不去梦魇。 
           Java,Python等语言不再直接提供指针以保证安全,提供自动的内存处理以避免可能的安全隐患。
           核心指针:指针指向一块内存空间。
           1.内存,变量,指针
           以下示例一块内存:(每个格子表示一个内存单元)
0123
4567
891011
12131415
            用数字给每个内存单元编号(上图中的0,1,2...等编号),在计算机而言,编号就是内存地址(当然实际地址多是32位的二进制表示)。这很容易理解,给每个内存编号,通过这些编号可以找到这个内存单元,才能往这个内存单元里读取或则写入数据 ,这是计算机运行最基本的法则。 
             int   N;      //定义一个int变量
             int  *P;     //定义一个指向存储int类型内存单元的指针,就是内存地址
             计算机角度而言,指针需要特别照顾,它存储的内存地址有别于一般数据。不管是变量还是指针都需要内存空间存储,唯一的不同点是存储内容性质不同,当访问到指针时,你自然会想到要看看它代表的那个内存地址存了些什么。
              
                   
             2.指针的操作
              & ;取址运算符,借助&可以让指针指向特定变量的内存地址。
             *  ;间接访问运算符,借助*可以间接地把指针指向地址里的内容取出来。
             +/-;加减运算符,类比房间号加减,很容易想到指针的加减实际上让指针指向了临近的内存。但需要注意,相对于单个变量的地址而言加减运算没有意义并具有风险,因为单个变量的地址临近的内存存储的内容是未知的。只有在指针指向一个数组(数组的内存地址是连续的),+/-便具有实际的价值。                                
             3.指针的诱人之处 
                       3.1高效的参数传递:函数参数的传递,一般是以实参复制给形参的方式实现,如果参数很大复制 过程巨大的消耗将让人难以接受,这时选择用指针传递参数的地址(地址大小是固定的)具有无可比拟的优势。
                       3.2动态内存分配支持:内存动态分配的实现依赖于指针,将动态开辟的地址赋给指针,通过指针对分配的内存进行访问,同样通过指针实现内存的释放回收。
                       3.3对链表的支持:链表是一种重要的数据管理结构,具有十分优秀的性能,应用十分广泛。指针的支持是链表能将不连续内存地址形成链的关键,指针就没有链表。
             4.指针的隐患
                       4.1指针未初始化;在C中并不对指针指向空间的内容进行检查,如果指针没有初始化,对该指针的使用将导致不可预测的结果。
                       4.2局部变量地址被回收引起异常:指针指向一个局部变量的地址,在局部变量生存期结束时系统将自动收回其内存空间,此时指针便指向一个不存在的空间。在两个指针指向同一个地址空间时,其中一个释放将会导致另一个指针置空。
                      4.3指针改变引起的内存泄漏
             
在这段代码中,指针P先是指向申请的int空间地址,随后P被赋值为int变量m的地址,开始申请的int空间将再也无法访问,同样无法释放,内存泄漏便发生了。
                       4.4指针越界:次情况多发生在指针访问数组时,这类问题稍不注意就可能发生,越界访问直接导致程序异常终止。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言指针可以用来实现数组和字符串的内存管理,可以用来实现动态内存分配,也可以用来实现函数参数的传递,以及指向结构体、和对象的指针。典型的应用例子包括:实现可变长参数列表的函数,在函数中声明指针数组,以及在函数中传递指向结构体的指针等。 ### 回答2: C语言指针应用非常广泛,下面是一个典型的例子: 假设我们需要编写一个函数来交换两个整数的值,我们可以使用指针来实现这个功能。首先,我们声明一个函数,函数有两个参数,型都是指向整数的指针。在函数内部我们使用一个临时变量来保存第一个整数的值,然后将第一个整数的值更新为第二个整数的值,最后将第二个整数的值更新为临时变量的值。这样就完成了两个整数值的交换。 下面是具体的代码实现: void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } 在这个例子中,我们使用了指针作为函数的参数,通过指针来访问和修改实参的值,可以实现对实参的修改。通过使用指针,我们避免了在函数内部创建临时变量的开销,同时也实现了对外部变量的修改。 使用指针还可以方便地进行动态内存管理。在C语言中,我们可以使用指针来申请和释放内存。通过指针,我们可以动态地创建所需大小的数组、链表、树等数据结构。并且在不需要使用这些数据结构时,可以通过释放内存来减少内存的占用。 总之,C语言指针应用非常灵活多样,可以解决很多复杂的问题。掌握好指针的使用,对于C语言程序的编写和性能优化都非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值