指针

//1.指针:地址
//2.指针变量:存放地址的变量
//3.&取地址运算符  *取值运算符  %p地址站位符
//4.int *p=NULL;      这里的*号只是提醒这是一个指针
//5.p=&a;             取出a的值
//6.printf("%p",p);   打印这个地址
//7.printf("%d"*p);   打印地址中存的值
//8.int a=10;         *&a;如果同时使用*和&作用会被抵消
//9.指针变量存的是内存的编号,这个编号占8个字节
//10.int *p=0x0;  p=p+1 对指针变量进行整形数加减,int类型一次移动4个字节 ,char类型一次移动1个字节,double类型一次移动8个字节,移动位置和类型有关
//***************************************************************************************************************************
    
//指针和数组之间的关系
/*
  1.一个数组的数组名其实就是地址,而且是首地址,而且是常量;
  2.计算机内存划分为五个区域:①栈区 ②堆区 ③常量区 ④静态区 ⑤代码区;所有的变量都被存放在栈区(不包括全局变量) ,自己申请的内存是放在堆区中,所有程序中的常量都被放在了常量区(常量区的东西无法改变),全局变量放在静态区,用static标注的也放在静态区.
  3.指针变量指向一个数组就是令指针变量等于数组名
    int a[10]={0};
     int *p=a;
  4.最正常的形式:a[i];
    文艺型的形式:p[i];
    闷骚型的形式:*(p+i);
    2B型的形式 :*(a+i);
  5.指针变量的大小跟操作系统有关
  6.指针变量取值的时候,注意和数据类型一致,否则容易出错
*****************************************************************************************************************************
 //指针和字符串的关系
 
 
 
 
 
 
    
    */
// int a=0;
// scanf("%d",&a);
    
    
//    int *p=NULL;         //这就是一个指针 NULL是空的意思 告诉我们这个指针变量什么也没指
//    int a=200;
//    p=&a;                //&取址符,取a的地址
//    printf("%p ",p);    //系统分配的地址
//    printf("%d",*p);     //取出地址中a的值

/*
    
    int *p=NULL;
    int a[5]={1,2,3,4,5};
    p=a;
    printf("%d ",p[0]);    //可以打印出1
    printf("%d",*(p+1));    //和数组配套使用 这种方法可以取出数组中相应的值,+1表示取第二个值
    
  */
//使用指针时 注意不要越界
    
    
 //定义一个数组  使用指针输出数组中的值
/*
    int m[10]={1,2,3,4,5,6,7,8,9,0};
    int *p=NULL;
    p=m;
    for(int i=0;i<10;i++)
    {
        printf("%d  ",*(p+i));  //p[i]也可以取出地址中的值,输出结果一样
    }
    
 */
   
    
   
   // int *p=NULL;
    /*
    int a[10]={0};
//int b[10]={0};
    p=a;
//   p=b;
//  a=b;   数组名是地址常量,里面的值不可以被改变
    
    printf("数组的大小:%lu ",sizeof(a)); //如果sizeof一个数组返回的大小是整个数组的大小
    printf("指针的大小:%lu ",sizeof(p)); //sizeof一个指针变量,返回的是这个指针变量的大小
    
    
    */
    
    //记住这几种方式 都可以直接取出数组中的某个指定的地址,即可输出其中的数
    /*int a[5]={1,2,3,4,5};
    p=a;
    
    p=a+2;
    p=&a[2];
    
    p=p+2;
    p=&p[2];
    
   */
    
 //重指向
   /* int a=0;
    int b=10;
    
    int *p=&a;
    //printf("%d ",*p);
    
    p=&b;
    printf("%d ",*p);
    
    */
    
    
   /*
    short a[4]={3,7,9,1};
    int  *p1=a;
    char  *p2=a;
   // printf ("p1=%d ",*p1);
    printf ("p2=%d",*(p2+4));
    
    */
   //指针和字符串的关系
    
    /*char a[]="你好我是字符串";
    a[18]='o';
    a[19]='';
    printf("%s ",a);
    
    
    char *str="字符串我来了";
   
    printf("%s",str);
    
    */
    
    
    
//通过指针可以计算字符串的长度。提示:遇到’’表⽰示字符串结束。
   /* char str[]="iphone";
    char *p=str;
    int count =0;
    while(*p!='')
    {
        count ++;
        p++;     //p是地址  一直往后加
    
    }printf("%d个字符 ",count);
    */
//两个指针相减 计算的结果是两个指针相隔多少元素
    /*
     int a[10]={0};
    int *r=a;
    int *p=a;
    
    p+=10;   //指针指向第十个元素
    long test =p-r;
    printf("%lu",test);
    */
    
//指针数组
   /*
    char *str[]={"abc","def","ghi"};
    printf("%s",str[0]);//这就是指针数组  []里面的数字可以指定输出哪个字符串
    
    */
    
    
    /*
    int a=10;
    int *p=&a;    //这样就存放了a的地址
    */

//指向指针的指针的定义
    /*
    int a=10;
    int *p=&a;
    int **r=&p;
    int ***c=&r;
    int ****d=&c;
    
    printf("%d",****d);  //输出d
    */
//注:永远不要使用没有赋过地址的指针,因为你不确定这里面存着什么.
   //如 int *p;  这是没有指向的指针
    
//使用指针交换两个数
   /*
    int a=10;
    int b=20;
    int *pa=&a;
    int *pb=&b;
    printf("a=%d,b=%d ",a,b);  //交换前
    change(pa,pb);
    printf("a=%d,b=%d   ",a,b);    //交换后
    
    */
    

原文地址:https://www.cnblogs.com/-ios/p/4673066.html