C语言中多级指针的重点分析

一、指针简介

       指针是C语言的灵魂,C语言之所以强大,很大一部分原因在于对指针的灵活运用。我们无论需要对内存的精准分配和释放,还是对接口api的使用,乃至面向对象中的类和对象的封装,都涉及到了指针。C语言的指针大致可以分为两种,一种是作为一个变量,其保存的是一段内存地址,也就是本文要谈的多级指针;另一种是作为一种数据类型,像函数指针,用于引出一种类型,主要用于回调函数。

二、指针与基础数据类型

  从内存的角度看,数据类型就是一段固定大小内存块的别名。

int a=0;

int在32/64位操作系统中都是占用4个字节,这段简单的代码相当于告诉编译器,让操作系统在栈区分配一块占4个字节的内存块,命名为a,并且初始化为0,a为变量名。
因此我们可以将这块内存的地址赋值给一个指针变量。

int* p=&a;

即p保存了a的地址,通过*p可以间接的改变a的值。而这样修改最大的好处是在于在函数调用中,或者说在不同模块中能够修改a的值。下面讲讲在开发中遇到的情形

char* p=NULL;
char buf[32]=" key1=  value";

假设上述代码是在主调函数中定义的,那么指针p在向NULL,意味着我们希望能在被调用分配内存,然后使p指向所分配的内存空间,那么此时就需要使用二级指针来存放p的地址了,假设我们需要设计一个去除字符串中的空格的函数,那么其接口如下

int ReSpace(char* p1,int len,char** p2,int* len2)
{.....}

调用方法:

char buf[32] = "key1=  value";
char* p = NULL;
int len1 = strlen(buf);
int len2 = 0;
ReSpace(buf,len1,&p,&len2)

即函数将去除空格的字符串通过p传出来了。同时二级指针也可以记录字符数组,或者二位数组的内存地址。因此也可以推出三级指针甚至是多级指针的用法了,即用来修改二级指针的值。

三、指针与结构数据类型

  1、结构体类型:

有以下一段代码

typedef struct _SCK_HANDLE
{
    char    version[64];
    char    ip[128];
    int        port;
    unsigned char    *p;
    int        plen;
}SCK_HANDLE; 

void main()
{
       SCK_HANDLE *hdl = NULL;
       hdl = (SCK_HANDLE *)malloc(sizeof(SCK_HANDLE));
}

即声明了一个结构体类型的指针,并且给它分配了内存空间,那么就可以将hdl指针作为一个参数传递给其他模块来改变这块内存中的值。

  2、数组指针

  初学C语言往往很难理解数组指针,也很容易和指针数组相混淆,事实上,如果只要明白数组指针就是一个行指针,指向的是一个数组,保存的是一个数组的地址。它的步长是数组的列数

     int c[5];
     int (*pointer)[5] = &c;

     int buf[10][30];
     int (*p)[30]=buf;   //    指向二维数组的首行      

四、使用指针时常见的错误

 1、用指针修改内存中的值时,应该确保所指的值能够被修改。如:    

char* p="abcdefg";
p[0]=‘w‘;   //错误,指向的是常量区的字符常量

  2、注意深拷贝和浅拷贝,即应该明确用指针分配了多少内存空间,以免出现重复释放内存的问题。

3、指针的步长问题

    指针步长和其存放的数据类型有关,每移动一步,编译器都会乘以其存放数据类型的长度,相当于移动到下一个数据。

4、sizeof 指针 求的是指针变量所占的内存,sizeof 数组名 求的 是数组所占的内存。

5、避免出现“野指针”,即释放指针所指的内存空间后,将指针置NULL。

总结

  指针是C语言中很细致的一个语法,再怎么说也说不完指针的所有应该场景。但是我们只要抓住它的根本,即从内存的角度去理解,分析,那么它就变得很好理解。我们在平时的学习中,多去应用它,学习指针的思想,站在内存的角度去思考,那么整个C语言的学习都会有很大的提升。

原文地址:https://www.cnblogs.com/ifyoushuai/p/8684959.html

时间: 2024-10-12 20:03:59

C语言中多级指针的重点分析的相关文章

如何理解c语言中得指针

最近有学习了c语言中得指针知识,脑袋都大了,迷迷糊糊理解了一半,由自己查了下资料,跟大家分享下c语言中指针的基本知识吧: 1.指针是一个地址,指向的是个类型. 2:指针指向的是地址,地址指向的是内容. 我们需要一个变量,来存储地址,这个变量的值是地址,但是我们可以通过修改变量的值,来不断的改变地址,但是,我们如果需要改变该个地址的值的话,就需要,对地址的值进行修改,而不改变地址. int a = 10: int *p : p = &a: *p =11: a=? 这里我们看到,p 是一个变量,我们

【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 编写高效的C程序与C代码优化 http://www.cnblogs.com/archimedes/p/writing-efficient-c-and-code-optimization.html

汇编语言的寻址方式与C语言中的指针是一个东西。

汇编语言的寻址方式与C语言中的指针是类似的! 汇编语言的寻址方式与C语言中的指针:寻找数据的方法. 指针就是存了 变量的地址,寻址方式就是得到保存变量的地址. 当你学了汇编语言,你就知道为什么C语言有函数指针,为什么函数要以return 结尾.为什么main()函数为程序的入口. 给我的感觉就是C语言是汇编语言的进化版本.因为C语言处处都有着汇编语言的影子. 一个小小的建议:先学习汇编语言.自学书籍是 清华大学 王爽的 汇编语言.之后,学习C语言,自学书籍,我还真不好推荐,我用的是C语言入门经典

C语言中函数指针

函数调用的方法有两种分别如下: void Fun(void) { //do something } int main(void) { ... Fun(); ... return 0; } void Fun(void) { //do something } int main(void) { ... void (*p)(void); p=Fun; p(); return 0; } 上面两种方式都可以调用函数,第二种方式在回调函数中用的最多,尤其是在操作系统的任务切换中.那么我们就重点来分析下第二种方

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

C语言中关于指针的学习

指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构: 能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序.指针极大地丰富了C语言的功能. 学习指针是学习C语言中最重要的一环, 能否正确理解和使用指针是我们是否掌握C语言的一个标志.同时, 指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试.只要作到这些,指针也是不难掌握的. 指针的基本概念 在计算机中,所有的数据

C 语言中的指针和内存泄漏

引言 对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在 C 语言中拥有的最强大工具. 本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密.本文内容包括: 导致内存破坏的指针操作类型 在使用动态内存分配时必须考虑的检查点 导致内存泄漏的场景 如果您预先知道什么地方可能出错,那么您就能够小

【转】C 语言中的指针和内存泄漏

避免陷阱 级别: 中级 Manish Virmani ([email protected]), 高级软件工程师, IBM 2006 年 10 月 26 日 在使用 C 语言时,您是否对花时间调试指针和内存泄漏问题感到厌倦?如果是这样,那么本文就适合您.您将了解可能导致内存破坏的指针操作类型,您还将研究一些场景,了解要在使用动态内存分配时考虑什么问题. 引言 对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试

黑马程序员--C语言中的指针(4)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 使用字符串指针变量与字符数组的区别 用字符数组和字符指针变量都可实现字符串的存储和运算. 但是两者是有区别的.在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘/0’作为串的结束.字符数组是由于若干个数组元素组成的,它可用来存放整个字符串. 2. 对字符数组作初始化赋值,必须采用外部类型或静态