游戏编程笔记8 --- 指针

指针

基础知识

获取变量的地址
  使用 & reference operator
  范例: cout << &num;

指针的定义
  指向一个地址, 并可以获取到它的value
  可以改变value和指向的地址
  如果改变指向的地址, 则原地址的value不会被改变

创建指针变量
  参数名称前面要加上*
int *ptrNum = &num;
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);                // 调用函数
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值