1. 程式人生 > >圖靈班第二次課---陣列、指標、二分查詢

圖靈班第二次課---陣列、指標、二分查詢

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小,則往高的位置查詢 */
}