C和指针

来源:互联网 发布:linux chgrp命令 编辑:程序博客网 时间:2024/06/03 21:02

最近看程序写代码发现在C语言上基础很薄弱,虽说大学四年学了之后也常有用到,但都是十分简单的应用,对于结构体和指针的认识上非常的不足,便找了《C和指针》这本书过来看,发现这本书对讲得非常的好,特别是结构体和指针,同时也补充了不少基础方面的知识,所以对这本书非常推崇。

static

        static关键字使用范围主要分为代码块外和代码块内

在代码块外用static声明变量时,其主要作用是将变量的链接属性从external变为internal,使其作用域被限制在当前文件中,外部其他文件代码不能通过external引用这个变量,在多文件程序中,用static关键字修饰的同名变量互不影响。

在代码块内,static关键字将变量的存储类型从自动变量修改成静态变量,即变量的值放在普通内存而非堆栈里面,在代码块程序执行之前创建并一直持续到执行完毕才销毁。

数组

     int  a[10]

     对数组a[10],&a[0]和a的值是一样的,都是指向数组第一个元素的指针。在c语言中指针表达式和下标表达式可以互换,对数组可以用*(a+num)和a[num]两种方式访问,一般而言,下标绝不会比指针更有效率,但指针有时候会比下标更有效率。

     指针数组 int  *api[10]

     下标引用的优先级高于声明,所以这个表达式中,首先执行下标引用,在取得数组元素后随即执行间接访问,故不同于int*  a,b  中b只是一个整型数据而非指针,api[10]是十个指向整型的指针构成的数组

结构体

     struct  SIMPLE  {

          int  a;

          int b;

          struct  SIMPLE  *p;

     };

     struct SIMPLE  *ap,sim;

     结构成员的两种访问方式:sim.a和ap->a;点操作用于对结构变量的直接访问。但当定义了指向结构的指针时,访问结构成员就用(*ap).a的方式,但针对于结构指针,c语言提供了更为方便的操作符来完成这一功能,->操作,->操作的左值必须是指向结构的指针。同时计算结构体占内存大小的时候必须将边界对齐考虑进来。

     结构的自引用,结构成员*p就是结构的自引用,用SIMPLE 类型的指针指向一个SIMPLE 结构,这样每个结构的指针指向同样数据类型的不同结构,利用这一特点就可以构成链表、树等更加高级的数据结构。注意自引用的变量是一个指针而不是实在的结构,一个结构包含类型为该结构的成员是不合法的。

指针

     对于指针主要掌握好*和&两个操作符的运用。对于一个数据将其分成三个属性:数值,存放地址,数据类型。

     对普通的数据,如int  a,其数值表达式为a,地址表达式为&a,数据类型为int型,对其进行*操作是非法的。

     而对于指针,如int  *p=&a,其数值表达式同样为p,只不过此时的p值是数据a的地址&a,我们称为p指向a的地址;地址表达式为&p,数据类型为int*型,但对其进行*操作具有特殊意义,即*p表示p值(即&a)所指向地址中的数据,即是a的值。

     理解了*和&,对于指向指针的指针我们也不难理解,如int  **pp=&p,即数值表达式pp是指针p的地址&p,地址表达式为&pp(当有指向指针的指针的指针时,其值为&pp),数据类型为int  **型,*pp操作即为pp所指向地址(&p)中的数据,就是p,而p=&a,*pp为数据a的地址,所以要取a的值时,再进行一次间接访问*即可,故**pp的值就是a的值。由此类推,对于多重指针并不难理解。

     为了加深对于*和&的理解,分析&*pp和*&pp的值,pp的值为指针p的地址&p,*pp即为地址&p中的值p,对*pp(p)再进行取地址操作&,所以&*pp就是地址&p,也就是pp;而&pp即为指针pp存放的地址,对其进行间接访问*操作,则为&pp中的值pp,与&*pp操作结果相同。

当使用指针逐个指向数组或字符串时(int a[] = {1,...,10};int *p = a;),使用下标的方式(p[i++])要好于*p++,因为下标并没有改变指针p的指向,而*p++实际上通过改变指针指向引用数组变量,这样有可能会指向不该指向的地方。

 

原创粉丝点击