1.如何定义结构题(三种类型)
(1)先定义结构体类型,在定义结构体类型变量
struct student
{
long number;
char name[20];
char sex;
int age;
float score[3];
};
定义结构体类型变量: struct student stu1,stu2;
(2)定义结构体类型同时定义结构体类型变量
struct student
{
long number;
char name[20];
char sex;
int age;
float score[3];
}stu1,stu2;
再定义变量:struct student stu3,xtu4;
(3)直接定义结构体类型变量
struct
{
long number;
char name[20];
char sex;
int age;
float score[3];
}stu1,stu2;
//该定义方法由于无法记录该结构体类型,除直接定义外不能再定义变量。
typedef:为数据类型定义一个别名
eg:typedef int interger
int x,y; <=> interger x,y;
int:存在变量 interger:别名
typedef + struct 结合使用
typedef struct tagMyStruct
{
int num;
long length;
}MyStruct; (1)
MyStruct:类型名
struct tagMyStruct
{
int num;
long length;
};
typedef struct tagMyStruct MyStruct; (2)
(1) <=>(2)
typedef + struct + 指针 结合使用
typedef struct node
{
int data;
struct node *next;
}*pointer;
等价于
typedef struct node *pointer;
struct node
{
int data;
pointer next;
};
等价于
struct node
{
int data;
struct node *next;
};
typedef struct node *pointer;
结构体变量的引用:
(1)结构体变量名.成员名
(2)指向结构体的指针变量名->成员名
pointer p;
printf("%d",*p.data); <=> printf("%d",p->data);
2.动态分配和释放存储单元的相关函数
malloc(size):
在内存的动态存储区中分配一个长度为size的连续空间(单位是字节)。返回一个指针,指向所分配的这个存储区域的起始地址。
返回指针为void类型 使用时需强制类型转换。
eg: int *p; p=(int*)malloc(3);
若无内存空间 则返回空指针
calloc(n,size):
在内存的动态存储区中分配n个长度为size的连续空间。
realloc(p,size):
将p所指出的已分配内存区的大小改为size,size可以比原来分配的空间大或小。
若更改后的存储空间不够,则重新申请一个size那么大的 存储空间,将原有的存储空间释放。
free(p):
释放有p所指向的内存区,使这部分存储区能被其他变量使用,free无返回值。
sizeof(type):
返回是一个对象或者类型所占的内存字节数。
new/delete使用要点:
new的使用:前后类型名要保持一致
(1)开辟单变量地址空间
int *p = new int; //定义一个int类型的量 将其起始地址赋值给指针p
int *p = new int(5); //定义一个int类型的量初值为5 将其起始地址赋值给指针p
(2)开辟数组空间
一维:int *p = new int[100]; //将数组这片连续空间的起始地址赋给指针变量p
//p相当于一维数组的数组名
二维:int (*p)[6] = new int[4][6];
delete的使用:释放new开辟的空间
(1)单变量空间的释放:
delete p;
(2)数组空间的释放(一维,二维)
delete [ ]p;
注意:若申请用int *p = new int[ ]; 但在释放时用delete p;则只释放了第一个变量的空间。
eg:
为p开辟单变量空间:
未开辟空间时:
修改后:
3.C++参数传递问题:
传值方式:
把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能,函数修改的时副本的值,实参的值不变。
传地址方式-----指针变量做参数
若在被调用函数中没有改变指针的指向,而只是改变指针所指向单元的值,则形参值的变化会影响实参的值。
若在被调用函数中改变了指针的指向,则形参值的变化不影响实参的值。
传地址方式-----引用类型做参数
j是一个引用类型,代表i的一个替代品
i值改变时,j值也跟着改变,所以输出如上
--------------------------------------------------------
使用引用类型进行交换:
传地址方式------数组名做参数
传递的是数组的首地址
对形参数组所做的任何改变都将反映到实参数组中
4.指针的定义
1.地址
内存单元的编号
从0开始的非负整数
范围:0-FFFFFFFF [0----4G-1]
2.指针
指针就是地址,地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
基本类型的指针:
int a = 5;
int *p; p=&a; //等价于 int *p = &a;
数组名
一维数组名是一个指针常数
它存放的是一堆数组第一个元素的地址
它的值不能被改变
一维数组名指向的是数组的第一个元素
下标与指针的关系
若定义了 :int a[10]; int *p; p=a;
可以以下方式访问:
(1) a[i]
(2) *(a+i)
(3) *(p+i)