• 重拾C,一天一点点_9-指针与数组


    这一章节很重要,一定要多思考、理解!

    指针是一种保存变量地址的变量。

    通常的机器 都有一系列连续编号或编址的存储单元。一个字节可存char类型,两相邻字节存储单元可存一个short,依此类推。

      p = &c;  //将c的地址赋值给p,即p是指向c的指针。

    地址运算符&只能应用于内存中的对象,即变量与数组元素,不能作用于表达式、常量或register类型的变量。

     1 #include <stdio.h>
     2 main(){     
     3      int x = 1, y = 2,z[10];
     4      int *ip;                    //ip是指向int类型的指针 
     5      ip = &x;                    //ip指向x
     6      y = *ip;                    //y=1 
     7      printf("%d
    ",y);          //1
     8      *ip = 0;                    //x=0
     9      printf("%d
    ",x);            //0
    10      printf("%d
    ",y);            //1
    11      ip = &z[0];                //ip指向z[0] 
    12      printf("%d
    ",ip);            //2686720 数组z的第一个元素的地址的值
    14 }
     1 #include <stdio.h>
     2 main(){     
     3      int x = 1, y;
     4      int *ip;
     5      int *z;                     
     6      ip = &x;
     7      printf("%d
    ", *ip);        //1
     8      y = *ip + 1;
     9      printf("%d
    ",y);            //2
    10      *ip += 1;
    11      printf("%d
    ",*ip);        //2
    12      printf("%d
    ",(*ip)++);    //2
    13      printf("%d
    ",++(*ip));    //4
    14      z = ip;                    //指针z也指向ip所指向的对象 
    15      printf("%d
    ", *z);         //4
    16 }
     1 #include <stdio.h>
     2 
     3 main(){  
     4     int i;
     5     int a[10];
     6     int *p;
     7     p = &a[0];
     8     printf("%d
    ", &i);        //2686780
     9     printf("%d
    ", a);        //2686720
    10     printf("%d
    ", &a[0]);    //2686720
    11     printf("%d
    ", &a[8]);    //2686720 int按4字节算,&a[8] = 2686720 + 8 * 4 
    12     printf("%d
    ", p);        //2686720    
    13 }

    指针只能指向某种特定类型的对象,即每个指针都必须指向某种特定的数据类型。有一例外,void 类型的指针可存放指向任何类型的指针,但不能间接引用其自身。

    //交换两值

     1 #include <stdio.h>
     2 void swap(int *px, int *py); 
     3 main(){  
     4     int i = 1, j = 2;
     5     printf("%d,%d
    ", i, j);    //1,2
     6     swap(&i, &j);    
     7     printf("%d,%d
    ", i, j);    //2,1
     8 }
     9 void swap(int *px, int *py){
    10     int temp;
    11     temp = *px;
    12     *px = *py;
    13     *py = temp;
    14 }

    一般来说,用指针编写的程序比用数组下标编写的程序执行速度要快。

    int a[10];        //定义一个由10个对象组成的集合,这10个对象存储在相邻的内存区域中 ,分别为a[0] 、a[1]...
    int *p;
    p = &a[0];            //将指针p指向数组第一个元素,p的值是数组元素a[0] 的地址     
    //如果p指向数组中的某个特定元素,则p+1将指向下一个元素,p+i将指向p所指向数组元素之后的第i个元素。
    //p指向a[0] ,*(p+1)引用的是数组元素a[1]的内容,*(p+i)=a[i]。
    p = &a[0]; => p = a(数组名所代表的就是该数组的第一个元素的地址) => a[i] = *(a+i) => &a[i] = a+i

    有点困,有点饶晕了,今晚学的有点少了,明天继续。晚安!

    原文作者:lltong

    博客园地址:http://www.cnblogs.com/lltong/

  • 相关阅读:
    iOS开发_WKWebView
    蒲公英获取UDID和下载App使用指南
    UIScrollView 遇到了AutoLayout之后其contentSize 的计算
    资料 和 快捷操作
    ME01 创建货源清单
    ME51N 创建采购申请
    LT01 创建转储单
    MM01 物料主数据批导
    PS 创建网络去掉反冲增强
    BP 供应商创建与修改
  • 原文地址:https://www.cnblogs.com/lltong/p/3385280.html
Copyright © 2020-2023  润新知