数组与指针

数组

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

数组的形式

一维数组

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 
}
原文地址:https://www.cnblogs.com/muxixixixi/p/10292967.html