指针学习

一.指针的定义与使用:
1.指针的初始化与赋值:
  若指针变量即没有初始化也没有赋值,则其指向的内存单元是不确定的,这时如果要操作指针就
  会出现问题,因此指针要先赋值(明确其指向哪)
        在进行赋值的时候要注意:
        (1).保证指针指向一个合适的值
        (2).指针类型一致才能赋值
             int a = 10;
             int *p = a;
             int b[2] = {0};
             int *p = &b;//错误,b是数组类型,&b是一个数组类型的地址
        (3).void类型的指针,可以存储任何类型的地址
            void v;//错误,不能定义void类型的变量
            void *vp;//注意,void类型的指针 不能解引用
2.指针运算:
   (1).  &  和  *
   (2).指针与整数的加减法:指针存储的是变量的内存地址,指针加减是指针向前或向后移动n个
        sizeof大小的存储单元
        int a = 10;
        int *p = &a;
        p = p+1; //指针向后移动4个字节
   (3).指针的自增自减运算:
        int a = 10;
        int *p = &a;
        *p++; //先读取p指向的变量5,然后指针向后移动4个字节
        *p++ = *q++ //等价于  *p = *q; p++; q++
       
   (4).两指针相减
        结果为一个整数,表示指针之间的数组元素的个数
   (5).void类型的指针
        在使用时只有通过强转才能使得 void* 得到具体变量的值

二.指针与字符串
    (1).char str[12];
        cahr *p_str;
        strcpy(p_str,"hello");  //野指针操作,因为p_str没有指向任何有效内存
    (2).char *p = "hello";
         char *q = "12345";
         p = q;            //只是将p指向了q,并没有将q赋值给p
        


         char *p = "hello";
         char *q = "12345";
         while(*q)                    //字符串赋值
             *p++ = *q++;
         *p = '\0'; //加上字符串的结束标志

三.指针与数组
    (1).一维数组的指针操作
         a[10];
         *(a+i); // 等价于a[i]
    (2).指针数组:数组元素为一个个的指针
         int *p[5]; //相当于5个 int * 
    (3).数组指针:是指向数组的指针
         int a[5];
         int (*p)[5];
         p = &a;

四.指针与函数
    (1).三个交换函数
    (2).指针型函数:{ 写一个大数加法  char* lddd(char *s1,char *s2)  }
            int *head(int size);  //head函数返回到一个int *
    (3).函数指针:   { 数据类型 (* 函数名) (参数列表) }
         函数指针在使用之前也需要进行赋值,使指针指向一个已经存在的函数代码的起始位置
         即:   函数指针名 = 函数名
        
         调用函数指针指向的函数有如下两种格式:
            1.   函数指针名(实参表);
            2.   (* 函数指针名)(实参表);  //这种写法更好理解
                 int add(int a,int b);
                 int (*fptr)(int a,int b);
                 fptr = add;
                
                 add(1,2); //1
                 (* fptr)(1,2);  //2
                 fptr(1,2);  //3三种一样的
        

五.指针常量与常量指针
    (1).指针常量:指针值不能被修改,所以保护指针的值不被修改
         int a = 2;
         int b = 3;
         int *const p = &a;  //p为指针常量并指向a的内存
         p = &b; //错误,指针常量的值为常量,不能指向其他变量
         p = NULL;  //错误,指针常量的值为常量,不能被修改
        
    (2).常量指针:指向常量的指针变量,保护指针指向的值不被修改
         const int a = 2;
         int b = 3;
         const int *p = &a; //定义一个常量指针并初始化
         p = &b; //正确,常量指针可以指向其他变量
         p = NULL;//正确,常量指针可以被修改
    (3).指向常量的指针常量:指向常量的指针,其指针本身也是常量
         常指针常量:记忆特点:自己不能修改,指向的常量不能修改!!
            定义格式:   const  数据类型  *const 指针变量  =  变量名;
                   或
                             数据类型  const  *  const   指针变量  =  变量名;
                    
         const int a = 2;
         int b = 3;
         int *q = &b;
         const int * const p = &a;//定义一个常量指针并初始化
         p = &b; //错误,常指针常量的值为常量,不能指向其他变量
         p = NULL;//错误,常指针常量的值为常量,不能被改变
         *p = b; //错误,常指针常量指向的为值为常量,不能被修改
         p = q; //错误,常指针常量的值为常量,不能被改变
         q = p;  //错误,两者的类型不同,一个为常指针,一个为非常指针

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值