非常非常基础的部分(有C语言基础的同学可以直接跳过)
基本数据类型
整型:short int long long long unsigned int
浮点型:float double
字符型:char
int h;
h=183;
double a=75.5;
char x='A';
指针:指针就是地址
/*
int a=150;
int*p; //此处表示定义了一个int类型的指针,名字叫p
p=&a; //指针是指向a的
int*p,*q; //定义两个指针
*/
int a=50,b=30,c;
int *p,*q;
p=&a;
q=&b;
/*
*p就是代表指向的对象的值,可以这样简单的理解*p等价于a
*/
*p=15;
C语言中的结构体
对于单一一个变量,int,char,double等等就够用了,但是如果不同数据类型的变量凑一起呢?假如我们输入一个班的学生的数据,每个学生都包含名字(字符),成绩(浮点型),学号(整型)如下:
//自己定义的数据类型
struct Student{
int a;
double b;
char c;
};
//用自己定义的数据类型去定义一个变量
struct student stu1;
//或者
struct Student{
int a;
double b;
char c;
}stu1; //和上面等价
student是我们自己定义的一个新的数据类型的名字
!!!typedef的作用!!!
C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等,下面就来举例:
typedef int zhengxing;
int a;
zhengxing a; //这两行代码完全等价,zhengxing就是int的别名
struct student{
int sno;
double ds;
};
struct student Lihua;
//下面使用typedef
typedef struct student{ //这里student可以省略(有时候不能省略)
int sno;
double ds;
}xuesheng; //typedef给struct student后面这一堆结构体换个名字
xuesheng Lihua;
typedef在链表中的应用
typedef struct LNode{ //此处LNode不能删除
int data;
struct LNode *next;
}LNode;
LNode head; //结点
LNode *p;
p=&head;
head.data=5; //对data赋值,和下面等价
p->data=4; //通过指针对data赋值
C语言中的数组(有序,同类)
//静态定义数组
int a[5]; //静态定义,下标从0开始
a[0]=80; //赋值第一个数据
int b[5]={98,87,34,32,4}; //数组初始化
int c[]={2,3,4,5,6};
typedef struct student{
int sno;
double ds;
}stu;
stu a[10]; //数组的名字是a,一共有10个数据元素,数据元素的类型是stu
a[0].sno=100; //对a[10]数组的第一个元素a[0]的sno项进行赋值
//动态定义数组,使用malloc
int*p;
p=(int*)malloc(sizeof(int)*5);
//sizeof计算其后括号内所占字节数
//sizeof(int)计算int所占字节数,(sizeof(int)*5)=4*5=20个字节
//malloc动态分配内存,分配完后返回该部分的首地址
//返回的首地址并不能说明是什么类型的首地址,比如char,int,unsigned int,所以要告诉编译器,这个是int类型的地址,使用(int*)强制转换
p[0]=99;
p[1]=87;
//在C语言中,数组名b实际上就是一个指针常量,即数组第一个元素的地址,类型取决于数组元素的类型
C语言中的函数定义
举个例子:现在有两个数,a(int),b(int),现在要交换两个数的值
int temp;
temp=a;
a=b;
b=temp;
如果我们多次使用这样的运算,一直重复写会很麻烦,于是我们自己定义一个函数:
void Swap(int &a, int &b) //void处是函数返回值的类型,void表示没有返回值
//形参 //void如果是int,就表示返回值是int类型
//Swap是函数的名字
{
int temp;
temp=a;
a=b; //函数体
b=temp;
return; //return表示函数结束
}
Swap(a,b);
C语言函数中的参数传递
1.值传递
形参:参数
实参:值
如果涉及main函数里值的改变的时候,不能用值传递,因为一旦定义的swap函数结束,将不会返回任何值给main函数
void swap(int a, int b)
{
int temp;
temp=a;
a=b;
b=temp;
return; //如果返回值是void类型,return可写可不写
}
void main()
{
int x=5,y=3;
swap(x,y);
printf("x=%d,y=%d",x,y); //此处会发现打印出来的x,y并没有什么变化,仍然是x=5,y=3
return;
}
2.地址传递
void swap(int*a, int*b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
return;
}
void main()
{
int x=5,y=3;
swap(&x,&y);
printf("x=%d,y=%d",x,y);
return;
}
3.C++中的引用
当原来的函数的值有变化的时候,用引用这种方式&
引用就是给变量起个别名
int a=3;
int &b=a;
b=b-1 //此时b=3,a=3,a,b完全等价
&a是C++里的引用符号,别名和正式名共享同一块内存地址
下面的代码可以这样理解:
a是x的一个别名,b是y的一个别名,a,x共享同一个内存地址,b,y共享同一个内存地址
即使swap函数不会返回什么值,但是由于共享地址,swap函数在运行时就会同时改变x,y,a,b的值,返不返回值已经无所谓了
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
return;
}
void main()
{
int x=5,y=3;
swap(x,y);
printf("x=%d,y=%d",x,y);
return;
}