圖靈班第二次課---陣列、指標、二分查詢
阿新 • • 發佈:2018-12-16
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小,則往高的位置查詢 */
}