zoukankan      html  css  js  c++  java
  • C基础入门(想到哪敲到哪的,可能不全,有漏洞)

                                             C基础入门

     第一天(数据类型与运算符):

            (1)对基本数据类型的了解:

                在32 位的系统上short 咔出来的内存大小是2 个byte;

                int 咔出来的内存大小是4 个byte;

                long 咔出来的内存大小是4 个byte;

                float 咔出来的内存大小是4 个byte;

                double 咔出来的内存大小是8 个byte;

                char 咔出来的内存大小是1 个byte。

               大致知道他们的取值范围,因为在赋值时会出现溢出现象;

             (2)对操作符的了解(只举经常用到的):

                   +,-,*,/  不解释;

                   %(重点)用于求余;(给我写一个水仙花数来练练这个求余(搜搜什么是水仙花数))

                {

                   int i=15;

                    int j;

                    j=15%10;

                    //此时j为5

                 }

      

                 

                   = 赋值运算符(不是等号)

                   == 这个是等号

                   !=这是不等号

                   >=,<=不解释

                   ++,--运算符(重点)

                  把这个运算恨敲几遍,搞懂,至少3遍;

                   {

                     int i=0;

                     int sum;

                      sum=i++;

                      //此时运算顺序是先把i赋值给sum,然后i+1;

                      sum=++i;//此时的运算顺序是i+1后再赋值给sum;

                    }

                 ||,&&这两个了解下,前一个是或逻辑,后一个是与逻辑,

                  {

                      int i=2,j=5;

                     (i>0||j>10)//此时是true;

                     (i>0&&j>10)//此时是false

                   

                   }

                 -=,*=,/=,+/这些玩意纯属造出来扯淡,不直观

                 sum-=i相当与sum=sum-i;//其他的一样,不解释;

                &取地址运算符,先了解下,后面会说;

                a?b:c这个最牛*了,太喜欢了,判断a,如果a为true,则取b,反之取c;

                   {

                      int i=0,j=2;

                      int result;

                       result=(i<j)?j:i;//判断i是否小于j,如果是就把j赋值给result,反之就把i赋值给result;

                    }

              (3)对数据的隐式和显式转换(不做重点,以后遇到问题了可以加个显式转化试试);

               隐式就是系统自动给你转换了

                  {

                   float i;

                    int j;

                    (j+i)//这两个数加起来就被自动转换为float类型

                  }

                 所谓显式转化就是在一个数据前面加一个数据类型,

                    int i;

                     (float)i//此操作就把i转换为了float类型

    ...........................................................................................................

    几道题(自己写,没思路的时候去敲helloworld去,等敲的很有成就感想这个):

      做这些程序时别用调用函数,就在main里干

        1.水仙花数

        2.搞几遍--,++运算符的原理

        3.对a?b:c的理解

        4.多敲敲第(1)中的数据类型,看看怎么会溢出

    ............................................................................................................

    第二天(几种操作运算符)

             (1)for

               对于for循环,这很使用,它无处不在,可以不知道while,但必须知道for,

            主要用法就是

                 for(i;j;k)这个形式;

              {

                  for(int i=0;i<100;i++) //这个是对i进行递加

                    {

                       //dosomething

                     }

                 for(int i=100;i>0;i--)//这个是对i进行递减

                 {

                       //dosomething

                 }

                }

               

          

          

               (2)if else

             对于 if ....else主要是判断用的

                  主要形式就是

                 {

                      if(int i>0)

                       {

                         //dosomething;

                       }

                      else

                       {

                        //dosomething;

                        }

                  }

                当然形式是自己吊出来的,随便套随便改;

                     

                        {

                          if(int i>0)

                           {//dosomething;

                            }

                           else if(int i>10)

                            {//dosomething;

                             }

                           else if(int i>20)

                            {//dosomething;

                             }

                          else

                          {//dosomething;

                            }

                         }

                     在if或者else里仍可以嵌套if...esle,不解释

               (3)while

                对于while同样是带有判断的循环;

               形式就是

                {

                    while(int i>100)//直到i大于100的时候停止循环

                     {

                       //dosomething;

                      }

                 }

               

               (4)switch() {case}

                 对于switch这个是个选择判断;

                 形式就是

               {

                 switch(判断的参数)

                  {

                   case 判断参数1:

                      //dosomething;

                      break;

                    case 判断参数2:

                      //dosomething;

                      break;

                        ......

                   

                   }

                 }

                (5)do while(至于这玩意吧,造出来也可能是个费的,没咋用过,看形式很神奇,前面还带个do)

                 形式就是

                     do

                        {

                      //dosomething;

                     

                          }while(判断)

               它跟while的区别就是,它先执行一次后在判断,这个在考试中貌似经常出,平时做项目没用到过;

                 (6)break,continue

                  这两个玩意,太风骚了,都是跳出,但管的范围不一样;

              break常用在switch中,就是直接跳出,哥们我不干了,爱咋咋地,说的就是他;

              continue常用在for或while循环中,他没break有骨气,只是偶尔的罢工,然后还得回来继续干活,他只是跳出本次循环

              break在switch中的应用就不解释了,在for里看看:

             for(int=0;i<100;i++)

             {

                 if(i==10){

                 printf("%d",i);//执行到i=10的时候,因为break这货要罢工,这个循环就停了,只循环了10下就完了

                break;}

             } 

               再来看看continue

             {

                 for(int i=0;i<100;i++)

                   {

                     if(i==10)

                      {

                       continue; //在这当i=10  continue罢工了一次,后面的printf语句不执行了,但是for会从i=11继续循环

                       }

                    printf("%d",i);

                   }

             }

     ...........................................................................................................

    几道题

      1.分别用for循环,while循环,do while循环算出一个100!的结果,效果分别是1*2*3*....*100=和100*99*98...*1=  

       2.分别用switch和if else写出成绩评价,当i<60 打印不及格,i>60且i<80打印良,当i>80,打印优秀;

      3.好好敲敲第(6)中我写的break和continue的代码,好好理解理解他们的区别

    .............................................................................................................

    第三天(对函数之间的调用关系)

      函数之间传递的是值;

      对于什么是实参,什么是形参,搞不明白算了,只要知道怎么用就够了;

      第一点:

          对于一般的函数调用

              (1)无参调用(说白了就是把被调用的函数的语句掉到了主函数里,为什么这么做,主要是那样看着好看,主函数看着不至于

    那么臃肿);

      {

         void print()

            {

             printf("hello world");

             } 

        void main()

        {

        print();

        }

      } 

          (2)对于有参的一般调用

            {

              void print(int i)

             {

                printf("输出%d",i);

             }

            void  main()

             {

              int j=2;

               print(j);

             }

           

             }

          

           (3)对于有返回值的带参数的一般调用(函数定义了什么返回值,最后的return类型也必须是什么类型,这个不解释)

           {

             int sum(int i,int j)

              {

                int sum;

                  sum=i+j;

                return sum;

              }

           void main()

            {

             int n=2,m=2;

             int sum;

             sum=sum(n,m);

             printf("输出的和是%d",sum);

       

             }

            }

          上面的都是很直观的调用和很直观的参数

    第二点:讲点关于传递地址和指针的玩意

            (1)对于地址传递的调用;

            不管在C#,C,C++,Java,还是网站语言PHP,我都碰到过这样一个典型的值传递例子,考试的话不考这个就是出题人的失职:

               

          void max(int a,int b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

          scanf("%d%d",m,n);

          max(m,n);

          printf("%d %d",m,n);

         }

    ........................................................

    ...........................................................

          void max(int &a,int &b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

          scanf("%d%d",m,n);

          max(m,n);

          printf("%d %d",m,n);

         }

    运行上面的两段程序,看看运行结果,有什么区别;原因就是一个是值传递一个是地址传递

    (2)对于在参数中取值的调用函数

          {

            void outPut(int i,int j,int *sum)

            {

               sum=i+j;

            }

          void main()

          {

           int m=2,n=2,i,sum;

           outPut(m,n,&i);//因为outPut函数第三个函数是*sum,所以在调用是要用地址来填参

          sum=i;//在这里就把m+n的值给引了出来;

       

           }

           }

      (3)对于近来在数据结构中经常出现的指针参数很无奈,在这也简单的说一下

          对于指针参数其实跟一般的参数一样,只是一般的参数的数据类型都很常见,一碰到了指针这个类型有点怕;

         但对于什么参数类型只要知道一点就够了,被调用的函数的参数是什么类型,在调用是也同样用什么类型,这在学习java或者c#是经常只是给你方法让你填参一样;

         {

            struct Person

              {

                  char name[10];

                   int age;

               }

             void print(Person *person)

               {

                  person->name="wanghe";

                  person->age=20;

                 printf("%s%d",person->name,person->age);

                 }

            void main()

           {

             Person *person=(*Person)malloc(sizeof(Person));//在这里定义了一个Person指针

            print(person)//因为在print函数里就是Person指针参数,所以在这里就放入person这参数;

            

            }

          }

    ..........................................................................................................

    至于题嘛,来一个输入一个长方体的长宽高,然后算出她的体积和各面的面积吧,要求用调用函数

    .........................................................................................................

    第四天:

            对于数组的理解

        对于数组都知道是用于原始存储数据的,它的初始索引值是0;

      第一讲:一维数组:

             对于一维数组就很简单了,

           (1)定义数组:数据类型 变量名[数组大小];

             下面主要举例对数组的具体操作:

              {

                 int data[5];

                for(int i=0;i<5;i++)

                 {

                    scanf("%d",&data[i]);

                 }//再此循环中对数组进行赋值

                for(int j=0;j<5;j++)

                {

                   printf("%d",data[j]);

                 }//在此对数组进行取值

               }    

             当然也可以对其进行直接赋值

             比如:int data[5]={1,2,3,4,5};

                   char data[5]={'a','b','c','d','e'};

                   char data[6]="abcde";//在这为什么是6呢,因为在"abcde"这个字符串中,这个是字符串有串尾结束符'\0'符,这点记住就行了;

                  用sizeof("abcde")可以得出是6;

            (2)对于数组指针这个玩意,这个指针是指向数组的头元素:

               例如:

                     int data[5]={1,2,,3,4,5};

                      怎么用指针来取它的值呢

                    {

                       int *p;

                       p=data;//这一步是用于去得数组的第一个元素地址

                      for(int i=0;i<5;i++)

                     {

                       printf("%d",*(p+i));//取得地址里的值

                      }

                     }

           (3)对于数组做参数

                 数组做参数跟其他的数据类型没区别:

                  {

                     void print(int data[])

                    {

                  for(int i=0;i<5;i++)

               print("%d",data[i]);

                      }

                    void main()

                  { 

                  int data[5]={1,2,3,4,5};

                  print(data);

                  }

                   }

             对于一维数组基础的就这些吧,扩展的玩意都可以在此基础上玩

          第二讲  就是二维数组了

                还是那样,对二维数组的操作还是分为三个方面(1.具体的存入取出,2.指针对他的操作,3.怎么做参数)

                 (1)对二维数组的存入和取出

                   {

                     //定义数组

                      int  data[3][3];

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

                       {

                         for(int j=0;j<3;j++)

                           {

                              scanf("%d",&data[i][j]);//对二维数组的循环存入数据操作

                            }

                        }

                    //下面进行取出操作

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

                       {

                         for(int j=0;j<3;j++)

                           {

                              printf("%d  ",data[i][j]);//对二维数组的循环取出数据操作

                            }

                               printf("\n");//这句换是让它成二维排列

                        }

                    }

                   对于普通的赋值:

                 data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

    (       2)对于数组指针这个玩意,这个指针是指向数组的第一行的第一个元素:

               例如:

                     data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

                      怎么用指针来取它的值呢

                    {

                        int  data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

                        int (*p)[3];//定义二维数组的指针,也叫数组指针,这里就不纠结于概念了,免得烦

                      p=data;

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

                     {

                     for(int j=0;j<3;j++)

                     {

                      cout<<*(*(p+i)+j);//这里出现了两个指针符,里面的是取行,加个列就成准确的行列

                       }

                     }

                     }

       可能现在还不好理解 ,等以后你敲的多了,会慢慢明白的

           (3)对于数组做参数

                 数组做参数跟其他的数据类型没区别:

                  {

                     void print(int data[][])

                    {

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

                    for(int j=0;j<3;j++)

               print("%d",data[i][j]);

                      }

                    void main()

                  { 

                  int  data[3][3]={{1,2,3},{4,5,6},{7,8,9}};

                  print(data);

                  }

                   }

             对于二维数组基础的就这些吧,扩展的玩意都可以在此基础上玩

             对于数组这玩意,也不要相的太复杂,它其实就是一个存入取出的工具,你越想的复杂你越搞不懂它;

     第五天:

             对于结构体的理解:

            其实结构体就是让你自己定义数据类型的,不是什么新鲜玩意,以前的像int  float什么的是系统给你的,现在给你自由了,让你自己来玩,应该是好事,其实在往深处玩代码时,你会发现往往系统给你的东西你总是不满意,老想玩自己写的。而结构体就是C给你的想象体,也学是C太古老了吧,我没在他里面发现class这个玩意,这里就不详细说class了,有兴趣自己可以查查,比struct好用多了。

      废话少说,开始玩代码:

             对于结构体的定义就是:

               C的标准:

               typedef struct {

                   数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                         .

                         .

                         .

                  

                    }结构名;//最后的这个“;”符号不能掉;

               C++就自由多了:

             struct 结构名{

                  数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                   数据类型 变量名;

                         .

                         .

                         .

                  

                    };

    对于结构体到底占多少了字节,那就是它里面定义的所以数据类型占的字节数总和;

     对于结构体的用法,应该都不陌生:

         {

            typedef struct

              {

                 char name[10];

                 int age;

              }Person;

         void main()

        {

            Person person;

             scanf("%s%d",&person.name,&person.age);

             printf("%s%d",person.name,person.age);

             Person *p;

              p=&person;//去person的地址

              printf("%s%d",p->name,p->age);

         }

           }

     当然也可以对结构体进行嵌套:

        typedef struct

        {

          char name[10];//姓名

          int age;//年龄

         }Person;

        typedef struct

         {

           Person person;//嵌套个结构体person;

           int num;//学号

          }PersonMsg;

    void main()

     {

       PersonMsg personmsg;

       //怎么对它进行赋值,看好了

        personMsg.person.name="wanghe";

        personMsg.person.age=20;

        personMsg.num=123456;

    //当然取值是也是一样

      }

      关于指针对他的操作就还是上面的玩意,没新意;

    结构体很简单,不要想复杂,就这几个操作;

    第六天 指针(其实也不能算是一个很多的题目)

          对于指针这玩意,也就在C或C++里看到,在C#,java,或者别的玩意里我都没见到,也确实没有,因为这玩意太危险,所以后来发展的高级语言都摒弃了,指针就想是一把枪,本来是要崩别人的,但是指向这个,再指指那个,最后拿枪的自己给自己给崩了,因为他也不知道到底指向了谁;

         (1)指向普通类型;

             比如 int ,float等;

              int i;

            int *j;

            j=&i;//在这里把指针指向了i的地址,这个地址名字叫j;

            *j=2;//为指向的地址的变量赋值

          (2)指向数组;这个在讲数组时说过了;

           (3)指向结构体,这个也讲过了;

       下面讲讲,指针在函数调用是的主要作用:

         由于指针是指向一个变量的地址,所以就确定了位置,不会变,能够确定操作的准确性,主要原因还是双向传递,互通的,而不是单单的单向值传递:

                 对于在函数调用那节的那个例子就很经典:

        {

          void max(int a,int b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

          scanf("%d%d",m,n);

          max(m,n);

          printf("%d %d",m,n);

         }

    运行结果:

      2 3

     输出 2 3

    ........................................................

    ...........................................................

          void max(int &a,int &b)

         {

          int tem;

          tem=a;

          a=b;

          b=tem;

         }

         void main()

          {

          int m,n;

          scanf("%d%d",m,n);

          max(m,n);

          printf("%d %d",m,n);

         }

    运行结果:

      2 3

     输出 3 2

    第一个就是单单的值传递,在mian函数里调用max函数,只是把m,n穿到了max里,但肉包子打狗,max也确实完成了任务但就是穿不过来

    第二个就不一样了,进行的是地址传递,在m,n传给max函数是,同时max还取得了m,n的地址,max在地址里把事就干了,完成了互通;

       对于在数据结构中出现的返回类型为指针类型的,说白了跟返回int类型一样:

    举个例子

     {

       typedef struct

       {

        int num;

         int age;

        }Person;

      *Person getPerson()

      {

         Person *p;//在这里p是个指针吧,等会就把它给返回了;

         Person person;

       p=&person;

        p->num=12;

         p->age=12;

       return p;

       }

    void main()

    {

     Person *p;

      p=getPerson();

      //这时得到的p->num就是12,p->age也是12;

    }

      }

    指针也不会玩太难的,就是这些基础;

    关于C的基础就这写吧,可能还有些琐碎的东西没点到,在学习的时候做参考吧,还是那句话,玩代码玩的就是熟练,多敲,如果只是为了考个试,少敲也无可厚非;  

  • 相关阅读:
    谈谈-开源数据库LitePal
    谈谈-Android-PickerView系列之封装(三)
    谈谈-Android-PickerView系列之源码解析(二)
    谈谈-Android-PickerView系列之介绍与使用(一)
    谈谈-ConstraintLayout完全解析
    问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7
    谈谈-BaseAdapter的封装
    谈谈-使用SparseArray和ArrayMap代替HashMap
    Spring 集成Redis Cluster模式
    Redis三种集群模式-Cluster集群模式
  • 原文地址:https://www.cnblogs.com/wangheblog/p/2765156.html
Copyright © 2011-2022 走看看