zoukankan      html  css  js  c++  java
  • 数组与指针

    数组

    所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。

    数组的形式

    一维数组

    int a [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,}
    

    int为类型名,a为数组名,[]则是数组长度,{}中的则是初值表.
    二维数组

    二维数组的赋初值方式有两种:

    1.分行赋初值

    int a [2] [3] = {{1, 2, 3},{4, 5, 6}}
    

    2.顺序赋初值

    int a [2] [3] = {1, 2, 3, 4, 5, 6}
    

    [2]则指的是行长度,[3]则指的是列长度
    二维数组的赋初值方式有两种:

    一些注意点:

    • 数组长度是一个常量

    • 数组的下标不能越界,其合理取值范围是[0,数组长度-1],就如:上面一维数组中a[0]为1,...,a[9]为10

    • 静态数组若没有初始化系统则会自动给所有的数组元素赋0

    • 赋值时尽量不要省略数组长度

      //顺序查找法
      #include<stdio.h>
      int main(void)
      {
          int i, flag, x;
          int a [5];
      
          printf("Enter 5 integers:");    
          for(i = 0; i < 5; i++)
          scanf("%d", &a[i]);
          printf("Enter x:");
          scanf("%d", &x);
          //在数组a中查找x
          flag = 0;                       //先假设x不在数组a中,置flag为0
          for(i = 0; i < 5; i++)
          if(a[i] == x)
          {                                    //如果在数组a中找到了x
              printf("Index is %d
      ",i);      //输出相应的下标
              flag = 1;                   //置flag为1,说明在数组a中找到了x
              break;
          }
          if(flag == 0)                    //如果flag为0,说明x不在a中
          printf("Not Found
      ");
      
          return 0;
      
       } 
      
    字符串

    字符串常量就是用一对双引号括起来的字符序列,即一串字符,其拥有一个结束标志'',将字符串存入字符数组时,数组长度至少是字符串的有效长度+1.
    赋值和输入字符串

      static char s [80];
      s [0] = 'a';
      s [1] = '';
    

    "a"和'a'的区别
    "a"是字符串常量,包括'a'和'',用一维字符数组存放;'a'是字符常量,只有一个字符,可以赋值给字符变量。

    指针

    指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

    定以指针变量要使用指针声明符 ,定义指针变量的一般形式为:

    类型名 *指针变量名

    int i, *p;
    

    指针变量要先赋值再使用,指针变量被赋的值应该是地址,例如:

    int i, *p;
    p = &i;     //为存放变量i的地址
    p = 0;      
    p = NULL;   //3.4则说明了怎样把特殊值0赋给指针p,这时指针的值为NULL
    p = (int *)1732   //此条语句中使用了强制转换来避免编译错误,表示p指向地址符为1732的int型变量
    

    指针的基本运算

    1. 取地址运算和间接访问运算
      单目运算符&用于给出变量的地址。例如:

      int *p, a = 3;
      p = &a;
      

    用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a。
    2. 赋值运算
    指针被定义并赋值后就可以进行赋值运算。例如:

       int a = 3; *p1, *p2;
       p1 = &a;
       p2 = p1;
    

    将变量的地址赋给指针p1,再将p1的值赋给指针p2。

    注意:
    • 不能用数值作为指针变量的初值,但可以将一个指针变量初始化为一个空指针。
      例如:

       int *p = 1000;     //这样是错误的
       int *p = 0;    //这里的0是ASCII字符NULL的值
      
    • 指针变量名是一个标识符

    • 一般情况下一旦指针变量的类型被确定后,它只能指向同种类型的变量

    • 不同类型的变量所占的内存空间不同,但不同类型指针变量所占的空间大小都是相同的

    • 类型转换有两种:
      1. 自动类型转换
      2. 强制类型转换

    使用强制类型转换运算符,可以将一个表达式转换成给定的类型。其一般形式为:
    (类型名) 表达式

    //指针和数组及储存单元
    #include<stdio.h>
    int main(void)
    {
    double a[2], *p, *q;
    
    p = &a[0];    //指针p向数组a的首地址 
    q = p+1;            //指针q指向数组元素a[1] 
    printf("%d
    ", q-p);      //计算指针p和q之间的元素的个数 
    printf("%d
    ", (long long) q- (long long) p);       //计算指针p和q之间的字节数 
    
    return 0;
    }
    

    指针与数组

    指针名是个变量,数组名是一个常量
    数组a是指针常量,不是变量,所以像a = p, a++, a+=2这样的表达式都是非法的,不能改变指针常量a的值。如果变量p是指向某个指定类型变量的指针,那么表达式p+1代表访问该类型的下一个变量的内存地址。比如:p+i ,p++ , p+=i这样的表达式是有意义的。

    数组是一块内存连续的数据。指针是一个指向内存空间的变量。
    指针+1指的是增加一个存储单元,数组+1后的地址指的是下一个元素的字节,而不是字节。
    若想改变常量的值则将它赋给指针变量

     #include<stdio.h>
     int Bsearch (int *p, int n, int x);   //函数声明 
     int main(void)
     {
        int a [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};   //有序数组 
        int x, m; 
    
        printf("Enter x:");       //提示输入 
        scanf("%d", &x);
        m = Bsearch (a, 10, x);
        if (m>=0)
        printf("Index is %d
    ", m);
        else
        printf("Not Found
    ");
    
        return 0;
     } 
     int Bsearch (int *p, int n, int x)   //二分查找函数 
    {
    int low, high, mid;
    low = 0; high = n-1;   //开始时查找区间为整个数组 
    while (low <= high) {   //循环条件 
          mid = (low+high)/2;    //中间位置 
          if(x == p [mid]) 
              break;        //查找成功,终止循环 
          else if (x < p [mid])
          high = mid-1;   //前半段,high前移 
          else 
           low = mid+1;     //后半段,low后移 
        } 
    if(low <= high)
       return mid;    //找到返回下标 
    else
       return-1;       ///找不到返回-1 
    }
  • 相关阅读:
    2019-2020-1 20191312《信息安全专业导论》第十二周学习总结
    GPG
    2019-2020-1 20191312《信息安全专业导论》第十一周学习总结
    wireshark
    ssh
    Nmap
    2019-2020-1 《python程序设计》20192428魏来 综合实践报告
    20192428 魏来 2019-2020《Python程序设计》 实验三 报告
    20192428 实验二《Python程序设计》实验报告
    20192428 实验一《Python程序设计》实验报告
  • 原文地址:https://www.cnblogs.com/muxixixixi/p/10292967.html
Copyright © 2011-2022 走看看