文章目录
指针
基础知识
获取变量的地址
使用 &
reference operator
范例: cout << #
指针的定义
指向一个地址, 并可以获取到它的value
可以改变value和指向的地址
如果改变指向的地址, 则原地址的value不会被改变
创建指针变量
参数名称前面要加上*
int *ptrNum = #
string* ptrStr = 0;
等同于没有指向任何东西
在声明指针变量时, 建议给它赋值一个 memory address
不建议只declare不赋值!! double *ptrDouble;
常量指针
不可以更改value, 但可以更改address
const int* ptr = &n;
不可以把 const 指针赋值给非const指针 (除非把const指针强转成非const类型)
输出地址
不加 *
范例: cout << ptrNum;
改变地址时, 会指向不同的对象, 原地址的对象不受影响
输出value
加上 *
dereference operator
范例: cout << *ptrNum;
改变value
范例: *ptrNum = 15;
原地址的value会改变, 指向这个地址的所有对象的value都会跟着改变
//改变value的例子
int a = 15;
int *ptrA = &a;
cout << a << endl; //15
cout << *ptrA << endl; //15
*ptrA = 100; //更改value
cout << a << endl; //100
cout << *ptrA << endl; //100
如何作为参数传递
void setValueAsZero(*pNum) {
*pNum = 0;
}
int main(){
int num = 5;
setValueAsZero(&num);
cout << num; //0
return 0;
}
Reference Object
和原对象指向同一个地址
规则
只能引用变量, 不能引用常量
只能指向一个对象, 并且无法修改, 无法指向别的对象
int num = 5;
int &rnum = num; // reference object
rnum = 6;
cout << num; //6
常引用
const int & num = a;
不可以修改引用的这个对象的内容
获取value
cout << rnum;
获取地址
cout << &rnum;
swap方法
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 5, b = 6;
swap(a,b);
cout << a << " " << b;
return 0;
}
引用作为函数的返回值
int n = 0;
int & demo() {
return n;
}
int main() {
demo() = 40;
cout << n; // 40
return 0;
}
Pointer Arithmetic
Pointer 和 Array
使用pointer遍历array比下标遍历更高效**
获取到array的第一个element
方法1: int *p = *arr;
方法2: int *p = &arr[0]
array的名字就是它第一个element的指针
遍历array的方法
cout << *(arr + 1); //value
cout << (arr + 1); //地址
排序array的方法
1. 快速排序
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
#include <stdlib.h>
参数列表:
base
: array的指针 (直接写array的名字就可以了)
num
: array的size
size
: array的每个element的大小
int (*compar)(const void*,const void*)
: 函数指针, 指向比较器方法.
两个参数就是两个要比较的element的地址
比较器方法要自己写哦
前者更小: 返回负数
前者更大: 返回正数
一样大: 返回0
范例:
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
//使用a和b之前, 需要强转
int* x = (int*) a;
int* y = (int*) b;
return *x - *y;
//return ( *(int*)a - *(int*)b );
}
int main ()
{
qsort (values, 6, sizeof(int), compare);
for (int n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}
function pointer 函数指针
指向一个函数 (function) 的 pointer
初始化
结构
返回类型 (*指针名)(参数类型1, 参数类型2, ...);
注意: 函数指针的返回值和参数值, 必须和它指向的函数是一样的
范例:
int (*ptr)(int, char);
此时, 这个指针还没有被指向任何函数
调用函数
结构
指针名(参数1, 参数2);
范例:
string test(int, double);
int main()
{
string (*ptr)(int, double);
ptr = test; // 给指针赋值
ptr(5, 2.34); // 调用函数
}