比如有天你说你要学习C++,要借我的这本 C++ Primer Plus,我把书给你送过去发现你已经跑出去打篮球了,于是我把书放在了你桌子上书架的第三层四号的位置。并写了一张纸条:你要的书在第 三 层 四号的书架上。贴在你门上。当你回来时,看到这张纸条,你就知道了我借与你的书放在哪了。你想想看,这张纸条的作用,纸条本身不是书,它上面也没有放着书。那么你又如何知道书的位置呢?因为纸条上写着书的位置嘛!聪明!!!其实这张纸条就是一个指针了。它上面的内容不是书本身,而是书的地址,你通过纸条这个指针找到了我借给你的这本书。
最简单的指针使用
#include <iostream> #include <stdlib.h> using namespace std; int main() { int i = 30; std::cout << "&i = "<< &i << std::endl; std::cout << "i = " << i << std::endl; int *pi = NULL; //初始为空 表明该指针不指向一个可访问的内存位置 pi = &i;//把 i 地址的编号赋值给 pi 。指针变量所存的内容就是内存的地址编号 std::cout << "*pi = " << *pi << std::endl; return 0; }
结果如下
&i = 0x7ffeb3485828
i = 30
*pi = 30
指针算法运算
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指针中第一个元素的地址 ptr = var; // 不需要加取地址符 for (int i = 0; i < MAX; i++) { cout << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // 移动到下一个位置 ptr++; } return 0; }
Address of var[0] = 0xbfce42d0
Value of var[0] = 10
Address of var[1] = 0xbfce42d4
Value of var[1] = 100
Address of var[2] = 0xbfce42d8
Value of var[2] = 200
传递指针给函数 总体上可以理解成全局变量 因为传的是地址, 修改之后在另一个函数内也变化
#include <iostream> #include <ctime> using namespace std; void get(unsigned long *par); int main () { unsigned long sec = 10; get( &sec ); cout << "sec: " << sec << endl; return 0; } void get(unsigned long *par) { *par = *par * *par; return; }
sec: 100
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; // 要生成和返回随机数的函数 int * getRandom( ) //返回指针 { static int r[10]; // 设置种子 srand( (unsigned)time( NULL ) ); for (int i = 0; i < 10; ++i) { r[i] = i; cout << r[i] << endl; } return r; } // 要调用上面定义函数的主函数 int main () { // 一个指向整数的指针 int *p; p = getRandom(); for ( int i = 0; i < 10; i++ ) { cout << "*(p + " << i << ") : "; cout << *(p + i) << endl; } return 0; }