Turing_class2---数组、指针、二分查找

1.scanf("%i",&n)
从键盘输入的值都是字符,%i的作用是将字符转换为整型,并存在与内存中。

2.内存
内存以字节为单位,连续排列。整型占4个字节。
在定义数组的时候,如int a[5];内存会给5*sizeof(int)个空间,而&a[i]即在内存中找到a[i]的位置。

举一个例子:

const int t = 5;
    int a[t];
    int* ptr = NULL;
    ptr = a;

在这里,数组a有五个数,在内存中显示为:a[0],a[1],a[2],a[3],a[4]
ptr是一个指针,如果用printf输出的话,就会显示a[0]的值
如果输出ptr+1的话,就会显示a[1]的地址,但是a[1]的地址并不与a[0]相邻,而是比a[0]多四个字节,因为ptr是整型,一个整型在内存中占四个位置,所以下一个数的指针是前一个数的第四个字节

/*整型数组在内存的位置*/
#include<stdio.h>
int main()
{
   const int t = 5;
   int a[t];
   int* ptr = NULL;
     ptr = a;
   printf("%p\n", ptr);
   printf("%p\n", ptr+1);
   return 0;
}
/*output*/
000000000062FDE0
000000000062FDE4
/*两者相差4*/

/*字符在内存中的位置*/
#include<stdio.h>
int main()
{
   const int t = 5;
   unsigned char aa[t];
   unsigned char* ptraa;
   ptraa = aa;
    printf("%p\n", ptraa);
    printf("%p\n", ptraa+1);
    return 0;
}


output

000000000062FDF0
000000000062FDF1
/*两者相差1*/

3.数组定义

/* 定长数组,长度写死 */
    const int t = 5;
    int a[t];
/* 变长数组? */
    int p = 5;
    /* int b[p];  按照C99标准不会报错,但不建议这样分配! */
    /* 分配变长数组的正确方式 */
    int* array = (int*) malloc( sizeof(int) * p );

p: 变量
sizeof(int):计算int在内存中占有的长度,不推荐直接写4,是因为有些电脑int在内存中是2,不能直接用
malloc()函数:原型为:void* malloc (long Num Bytes),返回一个空类型指针,即在内存中分配了名为Num Bytes的空间,void意味着未指定字节,所以在分配变长数组时,要加上(int*),使之成为整型数组

/* 包含分配数组内存函数的头文件*/
#include<stdlib.h>
/* 包含初始化数组函数的头文件*/
#include<string.h>

5.将数组里面的数相乘

#include <stdio.h>
int ArrayMul(int a[], int len);
/*声明一个调用数组的函数,要有数组和长度作为形参*/
int main()
{
    int p = 5;
    int array[]={4,3,3,4,5};
    int res = ArrayMul(array, p);
    printf("%d\n", res);
      return 0;
}
int ArrayMul(int a[], int len){
    int res = 1;
    for(int i = 0; i < len ; i++)
    /*i不能等于len,如果等于的话就超过了数组的范围,取值为0*/
        res = res * a[i];
    return res;
}
/*因为调用函数传递的是数组的指针,所以如果在函数里面将数组里面的数换掉,返回main函数并输出的话,原数组就会变成现在的数组*/

6.在数组普通查找一个值,并输出下标值

#include<stdio.h>
int TrivialSearch(int sSource[], int array_size, int key);
/*在声明中加了一个key值,即要寻找的值*/
int main(void){
    int a[10] = { 12, 23, 46, 75, 89, 93, 103, 132, 4781, 31235};
   int res = TrivialSearch(a, 10, 93);
  printf("%d\n", res); 
  return 0;
}
int TrivialSearch(int sSource[], int array_size, int key){
    int res = -1;
    for(int i = 0; i < array_size; i++){
        if( sSource[i] == key ){
            res = i;
            break;
        }
    }
    return res;
}
7.二分查找

#include<stdio.h>
int RecBinSearch(int sSource[], int array_size, int key);
int main()
{
   int a[10] = { 12, 23, 46, 75, 89, 93, 103, 132, 4781, 31235};
   int res2 = BinSearch(a, 10, 103);
    printf("%d\n", res2);
    return 0;
}
int BinSearch(int sSource[], int array_size, int key)
{   
    int low = 0, high = array_size - 1, mid = -1;
    while (low <= high)
    {       
        mid = (low + high) / 2 ; /* 获取中间的位置 */
        if (sSource[mid] == key)            
            return mid; /* 找到则返回相应的位置  */
        if (sSource[mid] > key)         
            high = mid - 1; /* 如果比key大,则往低的位置查找 */
        else
            low = mid + 1;  /* 如果比key小,则往高的位置查找 */
    }   
    return -1;  
}

7.递归的二分查找

#include<stdio.h>
int RecBinSearch(int sSource[], int array_size, int key);
int RecFunc(int sSource[], int low, int high, int key);
int main(void){
    int a[10] = { 12, 23, 46, 75, 89, 93, 103, 132, 4781, 31235};
    int res1 = RecBinSearch(a, 10, 93);
    printf("%d\n", res1);
    return 0;
}
int RecBinSearch(int sSource[], int array_size, int key){
    return RecFunc(sSource, 0, array_size-1, key);
}
int RecFunc(int sSource[], int low, int high, int key){
    if( low > high )
        return -1;
    int mid = (low + high) / 2; /* 获取中间的位置 */
    if (sSource[mid] == key)            
        return mid; /* 找到则返回相应的位置  */
    if (sSource[mid] > key)
        return RecFunc(sSource, low, mid - 1, key);
    /* high = mid - 1    如果比key大,则往低的位置查找 */
    else
        return RecFunc(sSource, mid + 1, high, key);
    /* low = mid + 1;    如果比key小,则往高的位置查找 */
}

猜你喜欢

转载自blog.csdn.net/weixin_43200912/article/details/82962845