(1)每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
  eg: int var1;

&var1  表示var1的地址。

(2)定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。
   int var=20;  
   int *ip;   //指针变量的声明
   ip=&var; //指针变量中存储var的地址
   cout<<ip<<endl;    //指针变量中存储的地址 0xbfc601ac

cout<<*ip<<endl;  //20,访问指针中地址的值

(3)指针数组
   int var[MAX]={10,100,200};
   int *ptr[MAX]; //把 ptr 声明为一个数组,由 MAX 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针。
   ptr[i] = &var[i]; // 赋值为整数的地址

cout<<*ptr[i]<<endl; // 10 100 200

(4)指针的指针
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。
当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。
一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。  int **var;
当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符
   int  var;
   int  *ptr;
   int  **pptr;
   var = 3000;
   // 获取 var 的地址
   ptr = &var;
   // 使用运算符 & 获取 ptr 的地址
   pptr = &ptr;
   // 使用 pptr 获取值 
   cout << "Value of var :" << var << endl;               //3000
   cout << "Value available at *ptr :" << *ptr << endl;   //ptr指针的值,3000

cout << "Value available at **pptr :" << **pptr << endl; //3000

(5)传递指针给函数
声明函数参数为指针类型即可。

double getAverage(int *arr, int size); //arr表示一个数组

(6)指向数组的指针
  数组名是一个指向数组中的第一个元素的常量指针。
  double *p;
  double balance[10]; //balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址
  p=balance; // p 赋值为 balance 的第一个元素的地址 
  使用数组名作为常量指针是合法的,反之亦然。因此,*(balance + 4) 是一种访问 balance[4] 数据的合法方式。

把第一个元素的地址存储在 p 中,您就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素。

(7)传递数组给函数
C++ 不允许向函数传递一个完整的数组作为参数,但是,您可以通过指定不带索引的数组名来传递一个指向数组的指针。
在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数
void myFunction(int *param){}
void myFunction(int param[]){}

void myFunction(int param[10]){}

(8)从函数返回数组
 从函数返回一个一维数组,您必须声明一个返回指针的函数

int * myFunction() {}

(9)C++引用
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 
  引用很容易与指针混淆,它们之间有三个主要的不同:
不存在空引用。引用必须连接到一块合法的内存。
一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
引用必须在创建时被初始化。指针可以在任何时间被初始化。
    int i=17;
int& r=i;  //&读作引用,r 是一个初始化为 i 的整型引用
cout<<i<<endl;  //5
cout<<r<<endl; //5
  引用通常用于函数参数列表和函数返回值。
  把引用作为参数。  C++ 支持把引用作为参数传给函数,这比传一般的参数更安全

    1. #include <iostream>
    2. using namespace std;
    3. // 函数声明
    4. void swap(int& x, int& y);
    5. int main ()
    6. {
    7. // 局部变量声明
    8. int a = 100;
    9. int b = 200;
    10. cout << "交换前,a 的值:" << a << endl;
    11. cout << "交换前,b 的值:" << b << endl;
    12. /* 调用函数来交换值 */
    13. swap(a,b);
    14. cout << "交换后,a 的值:" << a << endl;  //200
    15. cout << "交换后,b 的值:" << b << endl;  //100
    16. return 0;
    17. }
    18. void swap(int& x, int& y)
    19. {
    20. int temp;
    21. temp = x; /* 保存地址 x 的值 */
    22. x = y;    /* 把 y 赋值给 x */
    23. y = temp; /* 把 x 赋值给 y  */
    24. return;
    25. }

对于C++指针的详细理解的更多相关文章

  1. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  2. 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)

    1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表)    例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...

  3. LWIP协议中tcp_seg结构相关指针的个人理解

    我曾经写在新浪博客上面,后来复制到这,图片就不行了. 原文地址转载  LWIP协议中tcp_seg结构相关指针的个人理解(http://blog.sina.com.cn/s/blog_7e586985 ...

  4. 对C语言中指针的入门理解

    通过一个例子引出对指针的概念理解 1,例子 #include<stdio.h> int main(void) { ; //小张的身高 ; //小李的身高 ; //小王的身高 int *xi ...

  5. C++:this指针的简单理解

    一.什么是this指针 要想理解什么是this指针,首先必须理解在C++中是如何为类的对象分配内存空间的. #include<iostream> using namespace std; ...

  6. [转帖]linux中systemctl详细理解及常用命令

    linux中systemctl详细理解及常用命令 2019年06月28日 16:16:52 思维的深度 阅读数 30 https://blog.csdn.net/skh2015java/article ...

  7. linux中systemctl详细理解及常用命令

    linux中systemctl详细理解及常用命令 https://blog.csdn.net/skh2015java/article/details/94012643 一.systemctl理解 Li ...

  8. c++中指针作为函数参数的详细理解

    在C语言中,函数的参数不仅可以是整数.小数.字符等具体的数据,还可以是指向它们的指针.用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着 ...

  9. js基础篇——原型与原型链的详细理解

    js中的对象分为两种:普通对象object和函数对象function. function fn1(){}; var fn2 = function(){}; var fn3 = new Function ...

随机推荐

  1. 第9步:ASMCA创建磁盘组

    注意,创建磁盘组时需要以grid用户身份执行,在那之前可能需要以root身份执行xhost+,即命令: 代码1 [root@sgdb1~]# xhost+ [root@sgdb1~]# su – gr ...

  2. (转)Unity笔记之编辑器(BeginToggleGroup、BoundsField、ColorField) ...

    1. BeginToggleGroup() BeginToggleGroup函数是定义了一个控制范围,可以控制该范围中的GUI是否启用,看下演示代码: [code]csharpcode: using ...

  3. SR领域文献资源汇总(链接地址)

    DRCN http://www.drcn.org/   The International Workshop on Design of Reliable Communication Networks ...

  4. poj 2752 Seek the Name, Seek the Fame (KMP纯模版)

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13840   Ac ...

  5. 第九篇:使用 lstat 函数获取文件信息

    前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个 ...

  6. 【BZOJ1570】[JSOI2008]Blue Mary的旅行 动态加边网络流

    [BZOJ1570][JSOI2008]Blue Mary的旅行 Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决 ...

  7. 【文章阅读】Java虚拟机系列学习

    总目录: Java虚拟机 - 随笔分类 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/category/731395.html 已读: Java虚拟机1:什么 ...

  8. Android异步处理之AsyncTaskLoader简单使用

    简介 不管是在Android应用开发还是Android平台开发中,异步处理通常是最基本的coding要求.如果你还在主线程中写一些数据库,网络请求,读写本地文件等操作的话那说明你还不是一个合格的And ...

  9. Thrift初试

    Restful 基于 Http 进行通讯. 开放.标准.简单.兼容性升级容易: 性能略低.在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC,RPC采用二进制传输.TCP 通讯,所以通常性能 ...

  10. Pat 1052 Linked List Sorting (25)

    1052. Linked List Sorting (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...