第七章 - c语言中的指针

第七章:指针

一、指针的基本语法
  1. 指针:是内存单元的地址,使用指针可以更灵活访问内存单元中的数据

  2. 变量是存放数据的内存单元,变量的地址就是指针,而且不同类型的变量有不同类型的指针

  3. 指针的定义:数据类型 *指针变量名 [= 初始值 ] ; // 初始值可以省略

    (1) 数据类型是指针所指向的内存单元的类型。前面数据类型是int型,则定义的为int类型指针变量;为float型,则定义的为float类型的指针变量
    (2) 初始值是数据类型的内存单元的地址,可以省略不进行初始化,null(代码值为0)可以作为任意类型指针变量的初值
    (3) 案例:int i, *p; // 声明int类型的变量i,变量p是指向int类型变量的指针
             int *q; // 声明一个指针变量p,指向 int类型变量
             char *cp; // 声明一个指针变量cp,指向字符类型变量
             float *fp; // 声明一个指针变量fp,指向float类型变量
             double *dp1,*dp2; //声明两个指针变量dp,指向双精度变量
    
  4. 指针的赋值:

    (1) &:地址运算符,可以获取对象类型变量的地址
    (2) int i, *p;
        p = &i; // 将int类型变量i的地址取出,得到int类型指针,将它赋值给int类型指针变量p中保存
        
        p = 0; // 将特殊值赋值给指针p,这时指针为NULL,代表空指针,不指向任何单元
        p = NULL; // 同上
    
  5. 指针变量的注意事项

    (1) 指针变量名是一个标识符,要按照c标识符的命名规则对指针变量进行命名
    (2) 指针变量的数据是它所指向的变量类型,一般情况下一旦指针变量类型被确认后,它只能指向同类型的变量
    (3) 在定义指针变量时需要使用指针声明符 *,但指针声明符并不是指针的组成部分。
        例如:int *p; // 说明p是指针变量,而不是 *p
    
二、指针的运算
  1. 指针的直接使用

    (1) 取地址运算:单目运算符 &,用于取出变量的地址
        int i, *p; 
    (2) 显示:printf函数可以使用格式符 %p可以将指针以16进制方式显示出来
        int i;
        printf("%p",&i);
    (3) 加减整数 n,常应用在数组元素的指针上,当前数组元素指针加整数n,表示当前数组元素之后的第n个元素地址
        例如:int a[10],*p1=a+5,*p2=p1-3;
        解析:p1指针变量中存放a[0]之后的第5个元素的地址,即a[5]的地址;p2指针变量存放a[5]往前三个元素的地址,即a[2]的地址
    (4)  两个同类型的指针相减:常用在数组元素的指针上,同一个数组的两个数组元素地址相减,结果是两个数组元素的下标之差:
         例如:int  a[10],*p1=&a[0],*p2=&a[9],n=p1-p2;
         解析:变量n中存放的是下标差 -9
    (5) 指针变量的自增++、自减--运算:常用在指向数组元素的指针变量上,++使指针变量指向下一个数组元素,--使指针变量指向删一个数组元素
        int i,a[5]={1,2,3,4,5},p=a; // 通过指针p访问数组a中的每个元素变量
        for(i=0;i<5;i++){
            printf("%3d",*p++);
        }
    
  2. 指针的间接使用

    (1) 间接访问指针运算是*号运算符,指针通过 * 运算可以访问所指向的内存单元
    (2) 例如:int i,*p=&i; // 这里的 * 号是定义指针变量的符号
             *p=100; // 此处的*是间接访问运算,*p可以访问p所指向的变量i,将100赋值给i
        例如:间接访问指针也可以使用[]运算
             int a[10],*p=a,i=1;
             p[i]=20;//p[i]相当于 *(p+i),访问数组a的元素a[1],使a[1]=20;
             p=a+5;  //p保存了a[5]的地址
             p[i]=30; // p[i]相当于 *(a+5+i),访问数组a的元素 a[6],使a[6]=30
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值