小知识——c++关于指针的理解
简介:
指针可以简化c++编程,在一些任务中没有指针是无法完成的(动态内存分配)
使用 & 可以获得变量在内存中的地址:
eg:
1 #include <iostream> 2 3 using namespace std; 4 5 int main () 6 { 7 int var1; 8 char var2[10]; 9 10 cout << "var1 变量的地址: "; 11 cout << &var1 << endl; 12 13 cout << "var2 变量的地址: "; 14 cout << &var2 << endl; 15 16 return 0; 17 }
定义:
指针:是一个变量,它的值是另一个变量的地址。在使用前要对它进行声明和赋值。
空指针:
NULL:为空指针,如果没有确切的地址可以赋值,为指针赋值一个null是一个好的习惯。
eg:
1 #include <iostream> 2 3 using namespace std; 4 5 int main () 6 { 7 int *ptr = NULL; 8 9 cout << "ptr 的值是 " << ptr ; 10 11 return 0; 12 }
执行结果是:ptr 的值是 0
大多数操作系统中程序是不允许访问地址为0的内存。该内存视为操作系统保留的,他可以表明指针不指向一个可以访问的内存,所以如果指针包含空值就假定它不指向任何东西。
对于空指针的的检查:
if (ptr) 或if (!ptr) 未初始化的变量存在垃圾直,会使程序的调试难以进行。
指针的运算:
指针可以进行 ++、 +、 -、 -- 运算。
如果ptr是指向1000的整形指针,ptr++是指向1004位置的指针。每增加一次往后移动4个字节,如果是字符型指针,ptr++指向1001,往后移动一个字节。
通常使用++、 -- 是在使用指针代替数组的时候使用。
eg:
1 #include <iostream> 2 3 using namespace std; 4 const int MAX = 3; 5 6 int main () 7 { 8 int var[MAX] = {10, 100, 200}; 9 int *ptr; 10 11 // 指针中的数组地址 12 ptr = var; 13 for (int i = 0; i < MAX; i++) 14 { 15 cout << "Address of var[" << i << "] = "; 16 cout << ptr << endl; 17 18 cout << "Value of var[" << i << "] = "; 19 cout << *ptr << endl; 20 21 // 移动到下一个位置 22 ptr++; 23 } 24 return 0; 25 }
编译结果:
Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200
指针的比较:
指针可以使用关系运算符进行比较:== 、<、>
eg:
1 #include <iostream> 2 3 using namespace std; 4 const int MAX = 3; 5 6 int main () 7 { 8 int var[MAX] = {10, 100, 200}; 9 int *ptr; 10 11 // 指针中第一个元素的地址 12 ptr = var; 13 int i = 0; 14 while ( ptr <= &var[MAX - 1] ) 15 { 16 cout << "Address of var[" << i << "] = "; 17 cout << ptr << endl; 18 19 cout << "Value of var[" << i << "] = "; 20 cout << *ptr << endl; 21 22 // 指向上一个位置 23 ptr++; 24 i++; 25 } 26 return 0; 27 }
运行结果:
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
指针数组和数组指针:
https://www.cnblogs.com/fanhua666/p/11505078.html
指向指针的指针:
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。
声明: int **var;
当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符
1 #include <iostream> 2 3 using namespace std; 4 5 int main () 6 { 7 int var; 8 int *ptr; 9 int **pptr; 10 11 var = 3000; 12 13 // 获取 var 的地址 14 ptr = &var; 15 16 // 使用运算符 & 获取 ptr 的地址 17 pptr = &ptr; 18 19 // 使用 pptr 获取值 20 cout << "var 值为 :" << var << endl; 21 cout << "*ptr 值为:" << *ptr << endl; 22 cout << "**pptr 值为:" << **pptr << endl; 23 24 return 0; 25 }
结果:
var 值为 :3000
*ptr 值为:3000
**pptr 值为:3000
C++ 传递指针给函数
eg:
1 #include <iostream> 2 #include <ctime> 3 4 using namespace std; 5 void getSeconds(unsigned long *par); 6 7 int main () 8 { 9 unsigned long sec; 10 11 12 getSeconds( &sec ); 13 14 // 输出实际值 15 cout << "Number of seconds :" << sec << endl; 16 17 return 0; 18 } 19 20 void getSeconds(unsigned long *par) 21 { 22 // 获取当前的秒数 23 *par = time( NULL ); 24 return; 25 }
结果
Number of seconds :1294450468
数组作为参数:
1 #include <iostream> 2 using namespace std; 3 4 // 函数声明 5 double getAverage(int *arr, int size); 6 7 int main () 8 { 9 // 带有 5 个元素的整型数组 10 int balance[5] = {1000, 2, 3, 17, 50}; 11 double avg; 12 13 // 传递一个指向数组的指针作为参数 14 avg = getAverage( balance, 5 ) ; 15 16 // 输出返回值 17 cout << "Average value is: " << avg << endl; 18 19 return 0; 20 } 21 22 double getAverage(int *arr, int size) 23 { 24 int i, sum = 0; 25 double avg; 26 27 for (i = 0; i < size; ++i) 28 { 29 sum += arr[i]; 30 } 31 32 avg = double(sum) / size; 33 34 return avg; 35 }
结果
Average value is: 214.4
C++ 从函数返回指针
函数声明:
int * myFunction()
{
.
.
.
}
另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。
eg:
1 #include <iostream> 2 #include <ctime> 3 #include <cstdlib> 4 5 using namespace std; 6 7 // 要生成和返回随机数的函数 8 int * getRandom( ) 9 { 10 static int r[10]; 11 12 // 设置种子 13 srand( (unsigned)time( NULL ) ); 14 for (int i = 0; i < 10; ++i) 15 { 16 r[i] = rand(); 17 cout << r[i] << endl; 18 } 19 20 return r; 21 } 22 23 // 要调用上面定义函数的主函数 24 int main () 25 { 26 // 一个指向整数的指针 27 int *p; 28 29 p = getRandom(); 30 for ( int i = 0; i < 10; i++ ) 31 { 32 cout << "*(p + " << i << ") : "; 33 cout << *(p + i) << endl; 34 } 35 36 return 0; 37 } 38 当上面的代码被编译和执行时,它会产生下列结果: 39 40 624723190 41 1468735695 42 807113585 43 976495677 44 613357504 45 1377296355 46 1530315259 47 1778906708 48 1820354158 49 667126415 50 *(p + 0) : 624723190 51 *(p + 1) : 1468735695 52 *(p + 2) : 807113585 53 *(p + 3) : 976495677 54 *(p + 4) : 613357504 55 *(p + 5) : 1377296355 56 *(p + 6) : 1530315259 57 *(p + 7) : 1778906708 58 *(p + 8) : 1820354158 59 *(p + 9) : 667126415
函数指针:
文档:函数指针
链接:
文档:10 数组指针和指针数组的区别
链接:http://note.youdao.com/noteshare?id=666741e0f5df0ba7beb2a97eeff1fdce&sub=wcp1565830202948624