zoukankan      html  css  js  c++  java
  • C语言第12轮:指针

    C语言第12轮:指针

    【学习目标】

    1.        指针

    2.        指针与数组

    A: 指针的概念

      内存存储单元按字节排序。每一个字节编有序号。我们称之为地址。因为能够通过地址就能够找到所要的内存单元,所以我们把地址成为指针。指针是个特殊的变量,它里面存储的数值被解释为内存里的一个地址

    作用:

    (1)       指针能够有效地表示复杂数据结构,如队列、栈、链表等

    (2)       指针能够像汇编一样处理内存地址,为动态内存分配提供支持

    (3)       指针能够实现对数组和字符串的方便使用,提高程序的效率

    B: 指针变量的定义

     

       数据类型  * 指针变量;

       如:

        

       int*p2;        /*p2是指向int型的指针变量*/
           float*p3;      /*p3是指向float型的指针变量*/
          char*p4;       /*p4是指向char型的指针变量*/

    说明:数据类型并非指变量本身的类型,而是该变量所指向目标变量的类型。指针变量仅仅能指向同类型的变量

    //指针的定义
    #include <stdio.h>
     
    int main( void )
    {
              
             //野指针:不是NULL指针,是向被释放的或者訪垃圾内存的指针
             int   *ptr1; //ptr1为int型指针,野指针,里面为垃圾地址
             char  *ptr2; //ptr2为char型指针,野指针,里面为垃圾地址 
             //在VC中编译,会提示ptr1和ptr2没有初始化
              
             float*ptr3= NULL;  //ptr3为float型指针,不是野指针,已经初始化为NULL
            
             //查看地址
             printf("( ptr1 )= %p
    ", ptr1 );
             printf("( ptr2 )= %p
    ", ptr2 );
             printf("( ptr3 )= %p
    ", ptr3 );
            
       return 0; 
    }

    C: 指针的赋值(注意:类型要匹配)

    (a)使用地址运算符&:

    如:

    int a =133;
    int * p1;
    p1= & a;    //使用地址运算符把a的值赋值给指针p1


    (b)将一个已具有指向的指针变量赋值给还有一个指针变量

    如(接上面的): 

    int*  p2;

                 p2=p1;      //p1和p2同一时候指向变量a

    (c)  指针与数组的赋值

       int a[5],*pa;
       pa=a;    //(数组名表示数组的首地址,故可赋予指向数组的指针变量pa)
      //也可写为:
       pa=&a[0];   //数组第一个元素的地址也是整个数组的首地址,             
      //当然也可採取初始化赋值的方法:
      int a[5];
      int *pa=a;


    (d) 字符串与指针的赋值。

    比如:

        char *pc;
        pc="C Language";  
         //或用初始化赋值:
        char *pc="C Language";
    


    PS: 不同意把一个数直接赋予指针变量。

    如:

       int *p;
       p=1000;    //类型不匹配。提示错误
       //改进方式
       P= ( int * )100; //强制类型转换。

    D:  &  * 的使用

    (a) 合法的使用取地址符能够得到一个变量的地址

    如:

      int a;
      int score[5]= {80, 90, 97, 98, 63};
      &a,&score[0];    //该操作合法
      &(a+5);         // 该操作非法,越界
      &a=123;       //该操作非法,须要的话必须的强制转换
      &score;        //该操作非法,score本身代表score的首地址

    (b)使用* 运算符,间接存取指针所指向的目标标变量的值(类型要匹配)

    itn  a = 234;
    int * p1;
    p1=& a;    //p1指向数组a
    printf(“%d
    ”, *p );  //符号*是把地址中的内容取出。

    E: 指针与整数相加减

        意义:表示指针的移动

    如: p+n   p-n  p++   p--  ++p  --p

    PS:

    (1)   当中的n为整数。地址的移动不能为小数。

    (2)   加法表示指针p向地址增大的方向移动。

    (3)   减法表示指针p向地址减小的方向移动

    (4)   至于移动的长度,是由计算机决定。

    如:设p是指向type(类型)类型的指针。n为整型表达式,则p+(或—)n为一个新的地址。其值为p+(或-)n*sizeof(type)。

    F: 指针与数组

       因为数组中的各元素的存储单元是连续分配的。因此能够用指针来訪问数组,数组名就是该数字的首个地址。

    如: int a[]=“abcdefg”;

         a 就是该数组的首地址。等价于&a[0]

    PS: 通过收地址,能够非常快的、方便的訪问数组中的其它元素。方法例如以下:

            首地址+ 偏移量

          a[ i ]能够转化为:  *(a+i),  *(&a[0]+i)

     

    指针与数组的比較

    指针

    数组

    保存数据的地址,不论什么存入指针变量的数据都会被当做地址来处理。

    保存数据。数组名为数组首元素的首地址。

    间接訪问数据。通过获取指针变量中的内容(地址),然后从这个地址提取数据。

    指针能够使用指针形式訪问数据,也能够使用下标形式訪问数据。

    直接訪问数据。能够通过指针的形式訪问数据,也能够使用下标訪问数据。

    通经常使用于动态数据结构

    通经常使用于存储固定数目

    使用malloc,calloc,recalloc和free函数分配内存

    不能删除分配的内存,能够删除数据

    【指尖的微笑】错误在所难免。希望得到大家的指正^-^

    转载时保留原文的链接(http://it.bangedushuren.cn/)原创,转载请注明

    版权声明:本文皆有[www.bangedushuren.cn]原版的,转载请注明http://dh.51zhui.cn/,谢谢

  • 相关阅读:
    [leetCode]剑指 Offer 43. 1~n整数中1出现的次数
    [leetCode]剑指 Offer 42. 连续子数组的最大和
    HDU
    HDU
    HDU
    HDU
    HDU
    HDU
    POJ
    POJ
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4731145.html
Copyright © 2011-2022 走看看