原创 C语言指针(下篇)

2012-6-19 21:59 1302 12 13 分类: MCU/ 嵌入式

 

接C语言指针(上篇)

/*********************************************************************************************
注意:函数指针变量与指针函数的区别:
函数指针:指向函数的指针变量
指针函数:返回指针也就是地址的函数他们侧重点不一样
**********************************************************************************************/
//函数指针变量
#if 0
int max(int a,int b)
{
 if( a > b ) return a;
 else  return b;
}

void main(void)
{
 int x,y,z;
 int ( *pfun )(int,int);    //定义函数指针变量 
 ser_init();
 printf("input two numbers:\n");
 scanf("%d%d",&x,&y);
 pfun = max;       //把函数名(函数入口地址)赋给函数指针变量
 z=(*pfun)(x,y);      //调用函数指针变量,实参x和y的值传递给形参a和b
 printf("max=%d\n",z);    //形参a和b的值发生交换存储在max函数存储区,因为pfun指针变量指向函数max首地址
}           //所以z取得max函数的最大值
#endif

//--------------------------------------------------------------------------------------------


#if 0
//返回指针的函数,函数返回值为地址
char *day(int n)
{
 static char *weekday[ ]={       //指针数组由指针元素组成
       "Illegal day",
       "Monday",
       "Tuesday",
       "Wednesday",
       "Thursday",
       "Friday",
       "Saturday",
       "Sunday"
       };
 if( n<0||n>6) return weekday[0] ;  //返回指针元素也就是地址
 else   return weekday[n];
}

void main(void)
{
 while(1)
 {
  if(!bflag)
  {
   int i;
  // char *day(int n);    //指针函数声明
   ser_init();
   printf("input No.:\n");
   scanf("%d",&i);
   printf("Num=%d--->Day=%s\n",i,day(i)); 
   bflag = 1;
  }    
 }
 
}
#endif

//---------------------------------------------------------------------------------

#if 0
void main(void)
{
 char string[]="I love you!";     //字符数组访问字符串
 ser_init();
 printf("string = %s",string);
}

void main(void)
{
 char *string="I love you! my baby";  //字符指针变量访问字符串
 ser_init();
 printf("string = %s",string);
}
#endif

//---------------------------------------------------------------------------------

#if 0
//选择法排序(由小到大排序)
void SelectSort(char *name[],int n)  //形参指针数组---由指向字符的指针元素组成  
{
 int i,j,k; //k为中间变量,暂存下标号  

 char *ps;  //中间指针变量,暂存值

 for(i=0;i {         // x0 x1 x2 x3 ...x(n-1) x(n)
  k = i;       //从下标0开始选择一个数,然后在后面的序列里比较,
          //如果有小于前面的那个数就交换下标号
  for(j=i+1;j
  {
   if(strcmp(name[k],name[j])>0 ) k=j;
  } 
  if(k!=i)  
  { //后面序列有大于前面那个数
   ps=name;    //name[]中的元素为指针地址
   name=name[k];
   name[k]=ps; 
  } 
  
 }
}
;j++)
;i++>


void print(char *name[],int n)
{
 int i;
 for(i=0;i
};i++) printf("%s\n",name);


void main(void)
{
 while(1)
 {
  if(!bflag)
  {
    int n;

    static char *name[]={"CHINA","AMERICAN","ENGLANGD","JANPANESE","GERMANY","FRANCE","AUSTRALIAN"};
    //定义指针数组:数组中的每个元素为一个指针
    n=7;

    ser_init();
   
    SelectSort(name,n); //指针数组的首地址传递给形参变量 
    
    print(name,n);
    printf("%c",*name[0]);   

    bflag = 1;
  }
 }

  
 
}
#endif
//----------------------------------------------------------------------------------------
#if 0

 

//选择法排序(由小到大排序)
void SelectSort(int *name[],int n)  //形参指针数组---由指向字符的指针元素组成  
{
 int i,j,k; //k为中间变量,暂存下标号  

 int *ps;  //中间指针变量,暂存值

 for(i=0;i {         // x0 x1 x2 x3 ...x(n-1) x(n)
  k = i;       //从下标0开始选择一个数,然后在后面的序列里比较,
          //如果有小于前面的那个数就交换下标号
  for(j=i+1;j
  {
  // if( strcmp(name[k],name[j]) > 0 ) k=j;
  } 
  if(k!=i)  
  { //后面序列有大于前面那个数
   ps=name;    //name[]中的元素为指针地址
   name=name[k];
   name[k]=ps; 
  } 
  
 }
}
;j++)
;i++>


void print(int *name[],int n)
{
 int i;
 for(i=0;i
};i++) printf("%d\n",name);


void main(void)
{
 while(1)
 {
  if(!bflag)
  {
    int n;

    static int *name[]={11,22,33,44,55,66};
    //name[0]=0xaa;
    //name[1]=0xbb;
    //name[2]=0xcc;
    //name[3]=0xdd;
    //name[4]=0xee;
    //name[5]=0xff;
    //定义指针数组:数组中的每个元素为一个指针
    n=20;

    ser_init();
   
    SelectSort(name,n); //指针数组的首地址传递给形参变量 
    
    print(name,n);

    bflag = 1;
  }
 }

  
 
}
#endif
//---------------------------------------------------------------------------------------
#if 0
//指向指针变量的指针变量
void main(void)
{
 while(1)
 {
  if(!bflag)
  {
   int x,*p,**pp; //pp为 指向整型的指针变量 的指针变量
   ser_init();
   printf("input one number:\n");
   scanf("%d",&x);
   p=&x;
  // p=&x;
   pp=&p;
  // q=&x;
   printf("%d\n",*p);   //变量x的值
   printf("%d\n",**pp);  //变量x的值
   bflag=1;
  }
 }
 
}
#endif

 

以上程序全部在Keil C 51编译器编译通过,下面是打包附件,欢迎大家讨论

 

;i++) printf("%d\n",name);
;j++)
;i++>;i++) printf("%s\n",name);
;j++)
;i++>

 

 

 

 

 

 

 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1525200 2012-6-27 16:06

看看
相关推荐阅读
用户1409899 2013-10-31 14:46
modbus协议crc-16算法
/------------------------------------- #if 0 #define uchar unsigned char #define uint  unsig...
用户1409899 2013-10-31 14:42
堆栈指针
  一道嵌入式系统设计师堆栈指针考题引发的思考: 在8086微处理器中,若(SS)=2000H,(SP)=0100H,(AX)=2117H,执行指令 PUSHAX后存放数据21H的物理...
用户1409899 2013-10-24 16:51
转载 :数据结构内存对齐
内存对齐 在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度。 我们还是先来看一段简单的程序: 程序一 ...
用户1409899 2013-01-14 09:51
中星微zc301b摄像头
  硬件环境:友善之臂mini2440开发板+中星微zc301b摄像头 软件环境:linux2.6.29内核+上位机Ubuntu8.04 日    期:2012-12-1...
用户1409899 2012-07-05 19:44
国嵌mp3播放器应用程序
************************************************* Function name: main Parameter    : void Descr...
用户1409899 2012-07-05 19:43
国嵌mp3播放器应用程序
1.掌握双向循环链表,对指针,结构体,动态分配内存等C语言要求较高 2.掌握多进程编程,以及共享内存通信相关方面的内容     /*  *     mp3播放器控制程序  * ...
我要评论
1
12
关闭 站长推荐上一条 /1 下一条