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");
}
网友评论