0.printf()、scanf()函数
printf()、scanf()函数需要输入输出某参数时,引用为其为地址(指针)
printf(“%d”,*p)(此处p为指针,p也可为已定义的某一类型变量名,输出结果为p所指向的地址中的内容),若printf(“%d”,&p)输出为p所指的地址。
Scan(“%d”,p)(此处p为指针)
printf(“%d”,p+10)为输出指针p后移10单位指针并输出移位后所指的内容
1.结构体成员变量的引用
主要有三种等价方法:如结构体名为Stu,*p=&stu(指向结构体指针的赋值方式)
Stu.成员名
(*p).成员名
p->成员名
- 指针运算符(可理解为,读取指向所指存储地址中存放的内容)
& 取地址运算符
指针的初始位置和变化位置相当容易错
分析程序时一定要分清指针的初始位置和变化位置
2.Status InitList_Sq(Sqlist &L){…}//create a new linear list 此处的&符号为C++中的参数引用运算符,传递的是Sqlist类型数据L的地址。详见《C++ primer 》复合类型中引用部分的内容。
3.typedef的用法
->用一个新的类型名代替原有的类型名 如:typedef int Integer//Integer类型与int作用相同
->用简单类型名代替复杂类型 如:typedef struct{int month;int day;int year;}Date;//声明一个新的Date类型代表满足上述内容的结构体类型,可用Date定义一些变量,Date birthday;Date *p;这种方法还可用在声明数组类型、指针类型、结构体类型、共用体类型和枚举类型等。如:typedef int Arr[10]; 然后用Arr去定义数组变量,Arr a,b;//定义数组a[10]和数组b[10]。
4.对于自增操作运算“++”,当a++与++a等效时,总用++a;自减操作有类似的性质。a++为先使用a的值,再自增1;++a为先自增1,再使用a的值。
5.指针和数组的应用
定义时常见的方法:
(1) int a[n];int *p;p=&a[0];
(2) int a[n];int *p=a;
(3) int a[n];int *p;p=a;
printf("%i\t",a[i]); printf("%i\t",p[i]); printf("%i\t",*p);这三个语句等效(%i为codeblocks输出格式控制符用语)
指针变量的含义
定义类型 类型表示 含义
int i; int 定义整型变量
int *p;int * 定义p为指向整型数据的指针变量
int a[5]; int [5] 定义整型数组a,它有5个元素
int *p[4]; int *[4] 定义指针数组p,它有4个指向整型数据的指针元素组成
int (p)[4]; int()[4] 定义p为指向包含4个元素的一维数组的指针变量
int f( ); int () 定义f为返回整型函数值的函数
int *p( ); int *() 定义p为返回一个指针的函数,该指针指向整型数据
int (p)(); int ()() 定义p为指向函数的指针,该函数返回一个整型值
int **p; int ** 定义p为一指针变量,它指向一个指向整型数据的指针变量
void *p; void * 定义p为一指针变量,基类型为void(空类型),不指向具体对象
6.关于函数调用的参数传递
如:调用void swap1(int *p,int *q)和void swap2(int *p,int *q)
void swap1(int *p,int *q)
{
int temp;
temp = *p;
*p=*q;
*q=temp;
}
void swap2(int *p,int *q)
{
int *temp;
temp = p;
p = q;
q = temp;
}
这里用swap1可以实现q与p所指地址中存放内容的交换,而swap2不能实现,原因是函数调用时实参向形参传递方向是单向的,而形参用后便消失。