c语言基础

2018-03-05  本文已影响12人  在下陈小村

1.6种基本数据类型及其长度
int 4、short 2、long 4、double 8、float 4、char 1

#include <stdio.h>
#include <stdlib.h>
main()
{
      int a=1;
      short b=2;
      long c=3;
      float d=1.1;
      double e=2.2;
      char f ="a";
      printf("int 的长度为%d\n",sizeof(int));
      printf("short 的长度为%d\n",sizeof(short));
      printf("long 的长度为%d\n",sizeof(long));
      printf("float 的长度为%d\n",sizeof(float));
      printf("double 的长度为%d\n",sizeof(double));
      printf("char 的长度为%d\n",sizeof(char));
      system("pause");
}

而java中的数据类型有8种,长度和C语言的也有所区别
int 4、short 4、long 8、double 8、float 4、char 2、boolean 1、byte 1
所以C语言和java数据转换的时候用int来表示short,用long long来表示long,用char表示byte。

2.C语言的输出:int %d,long %ld,short %hd,char %c,float %f,double %lf,无符号数 %u,十六进制 %x,八进制 %o,字符串 %s

3.C语言输入scanf(“%d”,&number);

4.C语言的指针
int* p表示定义一个指针变量,p变量中存放了内存地址,这个地址用整数类型来表示。
*p表示保存在p内存中的值。

#include <stdio.h>
#include <stdlib.h>
main()
{
      int a=1;
      int* p=&a;
      int** q=&p;
      printf("a的地址为%d\n",p);
      printf("a的值为%d\n",*p);
      printf("a的值为%d\n",**q);
      system("pause");
}

指针是地址,指针变量是存放地址的变量。但是指针变量通常称为指针。

5.值传递和引用传递

#include <stdio.h>
#include <stdlib.h>
void swap(int* p,int* q)
{
     int temp=*p;
     *p=*q;
     *q=temp;
}
main()
{
      int a=3;
      int b=5;
      swap(&a,&b);
      printf("swap后的a=%d\n",a);
      printf("swap后的b=%d\n",b); 
      system("pause");
}

所有语言、所有平台都只有值传递,引用传递传递的值是内存地址。
在C语言里面直接改变了内存里面的值。

6.主函数获取子函数里面的值的内存地址

#include <stdio.h>
#include <stdlib.h>
void function(int* p)
{
     int a=1;
     printf("p的内存地址为=%#x\n",&a);
     *p=&a;
     
}
main()
{
      int* mainp;
      function(&mainp);
      printf("mainp的内存地址为=%#x\n",mainp);
      system("pause");
}

说白了就是把主函数里面的指针变量的内存地址,交给子函数,子函数通过*p给mainp赋值。

7.数组

#include <stdio.h>
#include <stdlib.h>

main()
{
      char arr[]="hello";
       
      printf("%#x\n",&arr[0]);
      printf("%#x\n",&arr[1]);
      printf("%#x\n",&arr[2]);
      printf("%#x\n",&arr[3]);
      printf("%#x\n",&arr[4]);
      
      printf("数组的地址%#x\n",&arr);
      
      char* p=&arr;//这里用了数组的类型char来盛放 
      //int* p=&arr;如果用int来盛放,p+1就变成了向右偏移了4位,刚还是int的长度 ,所以要用数组类型来盛放,之后的每一个下标的数据,只要依次加一就行了。 
      printf("%#x\n",p);
      printf("%#x\n",p+1);  
      printf("%c\n",*p); 
      printf("%c\n",*(p+1)); //表示向右偏移1位 ,char的长度 
      printf("%c\n",*(p+2)); 
      printf("%c\n",*(p+3)); 
      system("pause");
}

在同一个数组里面才有偏移,两个不同的数组不能进行偏移运算。

8.栈:程序中申请的变量就是存放在栈当中的
堆:通过new/malloc申请的空间就是在堆当中的。

9.动态分配内存

#include <stdio.h>
#include <stdlib.h>
main()
{
      int* p=malloc(sizeof(int)*10);
      *p=10;
      *(p+1)=20;
      printf("%#x\n",p); 
      printf("%d\n",*p); 
      printf("%#x\n",p+1); 
      printf("%d\n",*(p+1));
      free(p);
      system("pause");
}

C语言动态分配的内存需要手动释放,free()。

10.动态分配内存练习

#include <stdio.h>
#include <stdlib.h>
main()
{
      printf("请输入班级人数:");
      int count;
      scanf("%d",&count);
      printf("count=%d\n",count);
      
      int* p=malloc(sizeof(int) * count);//动态分配内存 
      int i;
      for(i=0;i<count;i++){
              printf("请输入第%d个学生的学号",i);
              scanf("%d",p+i);
              
              }
      printf("请输入新增人数:");
      int newCount;
      scanf("%d",&newCount);
      p=realloc(p,sizeof(int) * (newCount+count));//在p的基础上增加内存分配 
      
      for(i=count;i<count+newCount;i++){
         printf("请输入第%d个学生的学号",i);
         scanf("%d",p+i);
      }
              
      for(i=0;i<count+newCount;i++){
              printf("请输入第%d个学生的学号为%d\n",i,*(p+i));
              
            }
              
      system("pause");
}

11.多级指针

#include <stdio.h>
#include <stdlib.h>
main()
{
      int a=7;
      int* p=&a;
      int** q=&p;
      int*** l=&q;
      printf("%d\n",a); 
      printf("%d\n",*p); //一级指针 
      printf("%d\n",**q); //二级指针 
      printf("%d\n",***l); //三级指针 
      system("pause");
}

12.结构体

#include <stdio.h>
#include <stdlib.h>
void study(){
     printf("askdjhfkasjdhflkjsahkdfjksjs\n");
     }
//结构体就是java中类的雏形 
struct student{
       int age;
       int height;
       char sex;
       //结构体中不能定义函数,但是能够定义函数指针 
       void(*studyP)();
       } 
main()
{
      struct student st={20,180,'m',study};
      printf("%d\n",st.age);
      printf("结构体的长度为%d\n",sizeof(st));//结构体的长度大于等于所有变量的长度之和,因为它会把长度补上去,比如struct结构体中会把char当做4来计算。
      
      //结构体中的函数指针的调用 的三种写法。 
      st.studyP();
      
      struct student* stP=&st;
      (*stP).studyP();
      
      stP->studyP(); 
      
      system("pause");
}

13.联合体

#include <stdio.h>
#include <stdlib.h>
main()
{
      union{int i; short j;char c} un;
      un.i=3;
      printf("%d\n",un.i);
      printf("联合体的长度为%d\n",sizeof(un)); //联合体的长度等于最大的变量的长度
      system("pause");
}

14.自定义类型

#include <stdio.h>
#include <stdlib.h>
typedef int aa;//这样aa就可以当做int来使用 
main()
{
      aa m=12;
      printf("%d\n",m);
      
      system("pause");
}
上一篇下一篇

猜你喜欢

热点阅读