c指针小结

1. 内存单元的编号( 即内存单元的地址 ) :指针 . 有时也叫内存单元的指针。

2. 指针时常量,指针变量才是变量( 即值为地址的变量)。

3. 变量的指针,就是变量的地址,存放地址的变量是指针变量。

4. 指针的定义:a. 指针类型说明(*) b. 指针变量名 c.指向的变量的数据类型

         int * p 

         c  a b

5. 二维数组是以行为首地址。(详细参考另一篇)

6. int * p p为指向整型数据的指针变量。

    int *p[4] 指针数组 ( 此数组中存放着指向整型的指针)

    int (*p)[4] p为指向含有4个元素的一维数组( 行级别 , 二维数组 )

    int *p( int a , int b) p为函数名,函数的返回类型为指针类型,指向int型。

    int ( *p )() p为指向一个返回 int 型函数的指针。

    int **p p是一个指针变量,它指向一个指向 int 型的指针变量 。


7. c 中字符指针,char *p ; 即可以指向字符串,又可以指向单个字符。

char *p = 'a' ;

char *p = "abcd" ;

指针P ,*P , & P 含义:



8. 只要是指针 , 使用它之前就必须保证指针变量的值是一个有效的值 , 否则就是一个野指针

9. free( p ) 过程

    首先 free( p ) , 释放内存 . ( 此时 p 为 野指针 , 所以... 并不释放 p 本身的内存 , 而是释放 p 所指向的内存空间 , p本身所占内存很小 )

    p = NULL ;  ( 防止野指针被乱用 )

10. 指针常犯的错误

      未初始化( 设置 NULL )

      使用完后 , free之后 , 未设置成 NULl , 并且直接使用, ( 使用 野指针 )

      指针操作越界

11. 对指针进行判断时, 常用方法如下

       while( pa && pb )                        --> 判断指针是否为真, 无法判断 , 只能判断指针是否为 NULL , 野指针不为 NULL , 所以无法判断


12. 指向结构体的指针 , 由于结构体名字不带表结构体的内存地址 , 所以把结构体当做一般变量来看待 , 当需要用到它的地址时 , 要加取地址符号 &

       例如一个函数 void DisplayStack(SqStack *ps)

       在 main 函数中 : SqStack sq ; DisplayStack( &sq);       --> 注意此处就用到了取地址符号 &

       结构体的定义如下 :

       typedef struct {
               int data[50];       /*Save data , 50 is stack size*/
               int baseLeft ;      /*stack's left base*/
                int topLeft ;       /*stack's left top*/
                int baseRight ;     /*stack's right base*/
                int topRight ;      /*stack's right top*/
       }SqStack ;

  13. int *p = NULL ; 与 int *p ; p = (int *)malloc(sizeof( int )) ; 区别

   首先 , 第一种情况 , p为野指针 , 编译器为 p 申请了内存空间 , 但是只申请了一个保存 p 的内存空间 , 并没有申请 p 所指向的内存空间 , 所以这时候如果你使用 p ,

   因为不知道 p 指向哪里 , 所以可能造成内存泄露 . 而第二种情况 , 编译器申请了 2 个内存空间 , 除了申请了一个保存 p 本身的内存空间外 , 还申请了一块 p 指向的

   内存空间 , 所以此时使用 p 指向就是合法的。因为已经确定了指向的内存空间 . 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值