「C语言笔记」 指针

 

指针

  • 指针的定义

    • 地址
      • 内存单元的编号
      • 从零开始的非负整数
      • 范围: 0 - (电脑内存大小)
    • 指针
      • 指针就是地址,地址就是指针
      • 地址就是内存单元的编号
      • 指针变量是存放地址的变量
      • 指针和指针变量是两个不同的概念
      • 但是要注意: 通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样
      • 指针本质就是一个操作受限的非负整数
  • 指针的分类

    1. 基本类型指针
      • 注意问题
          int * p;    //p是变量的名字,int * 表示p变量存放的是int类型变量的地址
                      // int * p; 不表示定义了一个名字叫做*p的变量
                      // int * p; 应该这样理解: p是变量名,p是变量的数据类型是int *类型
                          所谓int * 类型,实际就是存放int变量地址的类型
        
          int i = 3;
          // p = i;   //这是错误的,因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量
          //p = 33;   //error 问题同上
          p = &i;  // OK
        
          p = &i;	
              /*  1. p保存了i的地址,因此p指向i
                  2. p不是i,i也不是p,跟准确的说:修改p的值不影响i的值,修改i的值也不影响p的值
                  3. 如果一个指针变量指向了某个普通变量, 则*指针变量,就完全等同于 普通变量
                      - 例子:
                          - 如果p是个指针变量, 并且p存放了普通变量i的地址,
                          - 则p指向了普通变量i.  
                          - *p 就完全等同于i
                          - 或者说: 在所有出现*p的地方都可以替换成i
                                  - 在所有出现i的地方都可以替换成*p
                          - *p就是以p的内容为地址的变量
              */ 
        
        • 如果更改*p的内容则i的内容也会更改
          • 例子:
              # include <stdio.h>
              int main(void)
              {
                  int * p;
                  int i = 3;
            
                  p = &i;
                  printf ("*p = %d\n", *p);
                  *p = 13;
                  printf ("i = %d\n", i);
            
                  return 0;
              }
              /*
              输出结果:
              *p = 3
              i = 13
              */
            
      • 附注
        • *号的含义
          1. 乘法
          2. 定义指针变量
             int * p;
             //定义了一个名叫p的变量,int *表示p只能存储放int变量的地址
            
          3. 指针运算符(书上是:目标运算符)
            • 该运算符放在定义号的指针变量的前面,如果p是一个已经定义号的指针变量.则*p表示 以p的内容为地址的变量
        • 如何通过被调函数修改主调函数普通变量的值
          1. 实参必须为该 普通变量的地址
          2. 形参必须为指针变量
          3. 在被调函数中通过 *形参名 = … 的方式就可以修改主调函数相关变量的值
    2. 指针和数组
      • 指针和一维数组
        • 数组名
          • 一维数组名
            • 一维数组名是个指针常量
            • 它存放的是一维数组第一个元素的地址
              • 例:
                  int a[5]	// a的值和a[0]的值是一样的
                
        • 下标和指针的关系
          • 如果p是个指针变量, 则 p[i] 永远等价于 *(p+i)
        • 确定一个一维数组需要几个参数【如果一个函数要处理一个一维数组,则需要接收该数组的哪些信息】
        • 指针变量的运算
      • 指针和二维数组
    3. 指针和函数

    4. 指针和结构体

    5. 多级指针

数据结构


返回顶部