清华大学出版社《c++程序设计》(第三版)中简单总结的一些知识点
- int *p 指向int类型的指针;指针变量存放着另一变量的地址,它本身也是一个变量,也有地址;*xptr,直接就代表了它所指向的x变量,不必纠结;
- 引用也是一种类型,int x;int &y=x;y就成了x的一个别名,对y操作就是对x的操作,和指针不同的是,一旦被初始化,就不能改变引用关系了
- 指针算数运算,p++,p+n位移;指针关系运算:前后p1<p2,是否空指针p1==0;指针赋值(地址常量或者变量)(数组名即数组第一个元素的地址)
int a[10],*aptr;
aptr = a;
aptr = &a[0];
a[5] = *(aptr+5) = *(a+5) = apter[5];
- 指针数组:例如按二维数组来储存字符串,按最长的来定义,造成空间浪费,如果采用指针,则可以存放任意长度的字符串;char *week[7]={“sunday”,“monday”……}
- 字符指针,将字符串指针指向字符串的首地址;用char类型定义字符串,除了字符数组,就是用字符指针不能直接定义char s=“fdsafd”,定义字符串指针后,对s的操作就是对字符串的操作
char *s="asfdqghv";
char *s;
s="asfdqghv";
//最好加const
- const限定符 (这里常量指的是不能变的,非常量指的是可以变的,主要看const摆哪)
- 指向非常量的非常量指针(那都不加const)
- 指向常量数据的非常量指针
- int i;const int p;p=&i;)p指向的整数不能通过p来修改,即通过p,但修改p是允许的,他可以指向别的如p=&j,也可以直接修改常整数j=10;
- const int val=10;const int *p;p=&val;)这时通过p和通过val都不能修改val的值;
- 指向非常量数据的常量指针
- (int var;int *const p=&var;) p指向的整数可以通过p来修改,但是p本身的值初始化后不能修改了,永远只能指向var
- 由于声明了是指向int变量,所以也不能指向const修饰的整形变量如(const int var)
- 指向常量数据的常量指针
- (const int val=10;const int *const p=&val;)
- 用于传递函数参数
- 函数参数是指针,合理使用const限定符,保证实参安全,又能避免普通传值带来的空间开销,例:void output(const double pd) {}(不能通过p修改参数)
- const修饰引用参数,例:void output(const double &d){}(d不能被修改)
- 指针和引用 见,p170例7-9,通过指针和传引用的用法上有区别,要理解其中的意思
指针:定义函数时void swap(int *x,int *y),调用函数时swap(&x,&y) 引用:定义函数时void swap(int &x,int &y),调用函数时swap(x,y) (我看到过这样一个描述,引用底层是一个自动解引用的const指针) 但指针过于自由,可以随便指,但传引用依附于固定对象,所以不容易出错,更易读。 - 动态内存分配(静态内存就是普通变量声明的内存,动态内存通过指针分配所需的内存呢,按需分配,及时释放)
c上遗留下来的方法malloc、free,如例7; new delete 方法 - 函数指针(int (*fb)(char));(要加括号否则变成对指针函数的声明,int *fb(char),表示返回指向int的指针)p177,例7-12
- 函数名就想数组名一样,代表指向储存函数空间的首地址 例如:int (*p) (int,int); int a(int,int); p=a,则p就指向了函数p,注意p和a的返回类型和参数类型都是一样的。可以int i=(*p)(1,2),即p的调用代替a的调用;int i=p(1,2) 也能工作
- 当某个函数的参数是函数指针 void a(int (*b)(int));某个函数int c(int) 正好a的参数类型匹配,则使用时这么用: a( c )就行了。
|