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