指针            :   地址 的代名词  ,  在32位系统中,指针就4个字节;

指针变量     :   存放指针这个概念的盒子

指针每次读取的数据大小,取决于定义指针的数据类型;(int  *p  ;  char  *p)

#include "stdio.h"
int a=0x213432;
int *p1;
void main()
{
  p1=&a;
  printf("%x\n",*p1);
}

结果:213432
int a=0x213432;

char *p1;

void main()
{

  p1=&a;
  printf("%x\n",*p1);
}

编译会出现警告warning: assignment from incompatible pointer type,
结果为32.

  

 

指针+修饰符

  • const  常量,只读【不能变】  

                             char *p;

                             const char *p;   p可以指向任意空间,但不希望改变其中的内容(与char const *p相同 )

 

                             char * const p        :     p一旦被赋值,将永远指向这个地址,但内容可以改变(与 char *p const相同 )   硬件资源

 

                             const  char * const  p     :  ROM



  • volatile  防止优化指向内存地址

                            volatile  char *p

  • typedef        别名

                           

 

 

指针+运算符

 

  • 加减运算        指针的加法/减法运算,实际上是增加一个单位(由定义指针的数据类型控制,大小可以使用   sizeof  (p[0])  )

                          int *p = xxx   [0x12]

                          p+1        [0x12+1*(sizeof(*p))]    

                           p++  p--   :更新地址  

  • 【】        变量名【n】

            n :  ID  标签      地址内容的标签访问方式    取出标签内存 里的值

                         适用于跳跃式访问,非线性

 1 #include"stdio.h"
 2 
 3 void main(){
 4 
 5 int a= 0x12345678;
 6 int b= 0x81234548;
 7 
 8 int *p1 = &b;
 9 char *p2 = (char *)&b;
10 
11 printf("the p1+1 is %x,%x,%x\n",*(p1+1),p1[1],*p1+1);
12 
13 printf("the p2+1 is %x\n",p2[1]);
14 }

结果为:
the p1+1 is 12345678,12345678,81234549
the p2+1 is 45

 

  • 逻辑操作符

                   >=   <=   ==      !=

                   *p1>*p2             地址中的内容的比较

 

                   常用: ----------------------   ==    !=

                                     1.跟一个特殊值进行比较   0x0 :地址的无效值,结束标志。   一般用 NULL表示0

                                     2.指针必须式同类型的比较才有意义,

 

多级指针

 

                    存放地址的地址空间。(主要强调一个       联系      )   char **p   (第二个* 修饰p,表示为指针,char修饰第一个*,表示二级指针的操作单位),指针结束条件为空。eg:   while (p[m] != NULL)

 

 

posted on 2018-10-09 18:39  ._初一  阅读(320)  评论(0编辑  收藏  举报