———————————————————————————————————————————————————
所有的指针所占的空间大小都是4字节,只是声明的类型不同,对于机器实质本质上没有什么区别,指正之间可以进行强制性转换
int a = 1;
int *p = &a;
float *p1 = (float*)p;
pi= malloc (sizeof ( int ) );
pf= (float *)pi;
很多系统中,指针类型的大小和int大小相同,所以有时会省去返还类型
——————————————————————————————————————————————————
检验是否为空指针 if(pi==NULL)
为什么需要检验:因为系统存在空间时,malloc函数会指向这块空闲空间。如果没有,就会返还NULL
free把空间还给系统
————————————————————————————————————————————————————
系统堆 heap(程序运行的时候分配储存空间)
______________________________________________________________________________________________________________________________
#include <math.h>
SWAP (x,y,t) ( (x)=( t ) , ( x )=( y ) , ( y ) = ( t ) ) ;
注意SWAP是大写
————————————————————————————————————————————————————
stdlib.h
rand ()%100
for(a-1,b-1 ; ; )
______________________________________________________________________________________________________________________________
C语言写 选择排序
思路是:
末尾设为min,前面的数中最小值和末尾进行替换
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXSIZE 101
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
void sort( int * List, int n )
{
int i,j,temp,min;
min= List[n-1];
for ( i= n-2 ;i > 0 ;i-- )
{ if( List[i] < min )
{ min = List[i] ;
j=i;
}
}
SWAP(List[j], List [n-1] ,temp );
}
int main(void)
{
int List [MAXSIZE]; // []中常数,所以已经在开头定义过这个数
int import_n;
int count;
int count_2;
int count_3;
scanf("%d",&import_n) ;
if( import_n > MAXSIZE || import_n < 1 )
{
exit (0);
}
else
{
for( count=0; count < import_n ;count ++ )
{ List[count] = rand () % 100;
printf ("%d ",List[count] );
}
}
for(count_2=import_n ; count_2>0;count_2--)
{
sort ( List, count_2 ) ;
}
printf("\n" );
for ( count_2 = 0 ; count_2 < import_n ; count_2 ++ )
printf("%d ", List[count_2] );
}
————————————————————————————————————————————————————
C语言条件运算符使用 http://c.biancheng.net/cpp/html/2912.html
条件? a: b
//条件成立返回 a,不成立返回b ,顺序从右向左,不清楚可以加上()
————————————————————————————————————————————————————
用宏实现来比较 x,y 大小
#define CPMPARE(x,y) ( ( (x)<(y) ) -1 : ( ( (x)==(y)) 0 ? 1 ) )
______________________________________________________________________________________________________________________________
折半查找
如果是,返还这个数;否则返还 -1
#include<stdio.h>
#define COMPARE(x,y) ( (x)<(y) ? -1: ( (x)==(y) ? 0 : 1 ))
int binarysearch ( int *List ,int left ,int right ,int searchnumber )
{ int middle;
while ( left < right )
{
middle = ( left + right )/2 ;
switch ( COMPARE( searchnumber , List [middle] ) )
{
case 1 : left = middle+1;
break;
case 0 : {
left = right ;
return List[middle];
}
case -1 : right = middle-1;
}
}
}
int main (void)
{
int arry_test[10]={1,2,3,4,5,6,7,8,9,10};
//test
printf("%d" , binarysearch ( arry_test ,0 ,9,7) );
}
————————————————————————————————————————————————————
与If不同:(当做if使用,需要每一句后面加上break)
当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句// default : 如case都不满足 ,执行此条件
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
☆递归算法
调用自身(直接递归) 调用其他函数(间接递归)
任何可以用赋值语句,if—else ,while 语句实现的函数,都是可以用 递归实现的,且通常实现比循环更易理解
工作:①建立递归停止条件 ② 实现递归调用,每次调用都应该向解决问题更近一步
#include<stdio.h>
#define COMPARE(x,y) ( (x)<(y) ? -1: ( (x)==(y) ? 0 : 1 ))
int binarysearch ( int *List ,int left ,int right ,int searchnumber )
{ int middle;
int q;
middle = ( left + right )/2 ;
if ( right <left ) //如果没有搜索到,返回 -2
return -2;
switch ( COMPARE( searchnumber , List [middle] ) )
{
case 1 : {
left = middle+1; /注意+1,如果不加1 ,没有找到的终止条件需要改变
return binarysearch (List ,left ,right ,searchnumber) ; }
case 0 : {
return List[middle];
}
case -1 :{
right = middle-1; //注意 -1
return binarysearch (List ,left ,right ,searchnumber) ; }
}
}
int main (void)
{
int arry_test[10]={1,2,3,4,5,6,7,8,9,10};
//test
printf("%d" , binarysearch ( arry_test ,0 ,9,0) );
}
————————————————————————————————————————————————————