2812|2

68

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

顶嵌嵌入式学习笔记:C指针学习总结 [复制链接]



来源:
顶嵌嵌入式培训
作者:顶嵌学员-员召伟

       指针是c语言的重点,指针及地址,利用指针可以灵活的实现对变量地址的操作。C是强语言,在指针的应用中应特别注意被操作指针的类型,层次,的一致性。

程序说明:

1 #include                           

2

3 int main()

4 {

5 int *p[4];

6 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

7p[0]=a[0];

8p[1]=a[1];

10p[2]=a[2];

11printf("*p[0]=%d,a[0][0]=%d\n",*p[0],a[0][0]);

12printf("*p[1]=%d,a[1][0]=%d\n",*p[1],a[1][0]);

13printf("++(*p[0])=%d,a[0][1]=%d\n",++(*p[0]),a[0][1]);

14return 0;

15}

    第5行定义了一个指针数组p,它的每个存储单元是一个指向int型的的指针,p应该就是一个指向指针的指针了。第6行对二维数组a初始化,11,12行,用p间接访问变量值。a在这里是一个数组类型的行地址,a[0]就应是一个列地址了,a[0][0]就是二维数组a的首行首单元的值了。13行,++(*p[0]),p[0]是指针数组的首单元的值,他是一个int型变量的地址,*p[0],是该int型变量的值,++(*p[0])就是对该整形变量值加1。

#include

int main()

{
        char str[20]="0123456789";

        char *p;

        int a=strlen(str);

        int b=sizeof(str);

        int c=sizeof(p);

        printf("a=%d,b=%d,c=%d\n",a,b,c);

        return 0;

}


      该代码中,p的内存分配长度为1个字节,str[20]为1*20个字节。而字符串“0123456789”在str[]中应占11个字节(“123456789+’/0’“)。Sizeof是一个c的运算符,其结果是计算被操作量的内存分配大小。如int是4,char是1,double是8。Strlen()是一个测量字符串长度的函数,该字符串必须以’/o’结尾,否则,出错。因此上述代码中strlen(str)的值为10,sizeof(str)的值为20。Sizeof(p)的值为1。

#include

int main()

{  

      static char *a[3]={"CPU", "Computer", "Microprocessor"};

      static char aa[3][15]={"CPU", "Computer", "Microprocessor"};

      int  i;

      for(i=0;i<3;i++)

      {

        puts(a);  //  以上用针数组实现

        puts(aa);  //  以上用二维字符数组实现

      }

}

       Static char *a[3]……行的初始化中,因为a的每个单元都是一个指针,则,按照,等号两边类型一致原则,该初始化中系统自动为3个字符串常量分配存储单元,并依次将其地址放在a的3个单元中。static char aa[3][15]……行,如上,等号两边类型一致,则左边只能放串值,又串在初始化中会自动在其尾加上一个’/0’符号,既标示串的结束,又是该变量之后的单元失效,在左边因aa是三层的二维数组,则,按行存储,因此右边的三个串就照应的了左边的三个层上了。这就是c的赋值过程。

#include

int  max_value(int  (*pa)[4], int  row);

int main()

{

      static int aa[3][4]={{1, 3, 5, 7},{2, 4, 6, 8},{20, 15, 32, 12}};

      printf("max element is %d\n",max_value(aa, 3));

      return  0;

}

  

int  max_value(int  ((*pa)[4], int  row)

{

      int  i, j, m=pa[0][0];

      for(i=0;i
       for(j=0;j<4;j++)

        if(pa[j]>m)

          m=pa[j];  

      return(m);

}


       该代码中主要注意三点:1,static,声明静态变量,用static声明的函数表示该函数只能被本模块(一般为该文件内)的函数调用。模块外不能,一般没有家static声明的函数默认为extended型(外部函数)及该文件外的函数只有通过函数声明就可用,用static声明的变同样有只使用于其模块内。2,注意int aa[3][4]={{1, 3, 5, 7},{2, 4, 6, 8},{20, 15, 32, 12}};这种赋值方式。3,max_value(aa, 3));在max-value调用中意味着int aa[3][4]与int  (*pa)[4]类型匹配,如上定义,aa是一个行地址,行长4,p是一个指向行长为4的地址的指针,则aa与p匹配。

#include

void summary(int  *p, int  n);

int main()

{

       static int a[11]={1,2,3,4,5,6,7,8,9,10};

       summary(a,10);

       printf("Sum is %d\n",a[10]);

       return  0;

}

void summary(int  *p, int  n)

{

      int  s=0;  

      while (n--)

        s+=*(p++);  

      *p=s;

}


      该代码中注意while(n--)循环中n--的用法,n—是n先完成所参与的运算然后自加,++n是n先自加,然后参与运算。

#include  

int  getchoice(char  **menu, int  n);



int main( )

{

      int  chc;

      static  char  *mn[5]={ "1.  Input",  "2.  Copy",

                             "3.  Move",  "4.  Delete",

                             "0.  Exit"};  

      chc=getchoice(mn, 5);

      if(chc>=0  &&  chc<5)

            printf("You choice No. is %d\n",chc);

      else

            printf("Invalid choice!\n");

      return  0;

}

int  getchoice(char  **menu, int  n)

{

          int  i,choice;

          for (i=0;i
            puts(*(menu+i));

          printf("\nInput  ypur  choice:");

          return(getchar( )-'0');

}


       该代码注意chc=getchoice(mn, 5);调用中mn与menu的类型匹配问题。
char  *mn[5]mn是一个指针数组,mn的每个变量是一个指针,则mn就是指向指针的指针,**menu也是一个指向指针的指针,因此类型匹配。

总结:

       C的学习核心是指针的掌握,指针这里有着重掌握指针的类型,层次,只有掌握了指针的类型与层次,才能真正的活用指针,才能真正的掌握C。


顶嵌学员:员召伟
20091018星期日


[ 本帖最后由 topembedded 于 2009-10-21 14:11 编辑 ]

最新回复

学习中...  详情 回复 发表于 2009-10-22 15:12
点赞 关注
个人签名顶嵌与您一起关注嵌入式行业!
http://www.top-e.org/

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
学习中...
 
 

回复

68

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
都是学员总结的
 
个人签名顶嵌与您一起关注嵌入式行业!
http://www.top-e.org/
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表