本文参考http://www.prglab.com/cms/pages/c-tutorial/advanced-data/pointers.php

1.存储其它变量地址的变量(如下面例子中的address),我们称之为指针(pointer)。

2.地址操作符/去引用操作符

在变量名标识符前面添加的与符号ampersand sign (&),该符号表达的含义是“......的地址(address of ...)”,所以称之为地址操作符。

例如:address=&value1;      //address 表示 value1 的地址

将变量value1的地址赋给变量address,因为当在变量名称value1前面加ampersand (&) 符号,我们指的将不再是该变量的内容,而是它在内存中的地址。

3.引用操作符(*)

使用指针的时候,我们可以通过在指针标识的前面加星号asterisk (*)来存储该指针指向的变量所存储的数值,它可以被翻译为“所指向的数值”("value pointed by")。

例如  value=*address;                    //value 为 address 所指向的数值

地址或反引用操作符Operator of address or dereference (&)

它被用作一个变量前缀,可以被翻译为“…的地址”("address of"),因此:&variable1 可以被读作 variable1的地址("address of variable1" )。

引用操作符Operator of reference (*)

它表示要取的是表达式所表示的地址指向的内容。它可以被翻译为“…指向的数值” ("value pointed by")。

* mypointer 可以被读作 "mypointer指向的数值"。

4.指针的声明和使用

(1).指针的声明

    type * pointer_name;

    其中type指的是指针所指向变量的类型,pointer_name指的是指针变量的名字;

  例如: int * number;
      char * character;
      float * greatnumber;

(2)指针的使用

#include <iostream.h>

int main () {
int value1 = , value2 = ;
int *p1, *p2;
p1 = &value1; // p1 = address of value1
p2 = &value2; // p2 = address of value2
*p1 = ; // value pointed by p1 = 10
*p2 = *p1; // value pointed by p2 = value pointed by p1
p1 = p2; // p1 = p2 (value of pointer copied)
*p1 = ; // value pointed by p1 = 20
cout << "value1==" << value1 << "/ value2==" << value2;
return ;
}

(3)指针和数组

数组与指针的概念联系非常紧密。数组的标识符相当于它的第一个元素的地址,就像一个指针相当于它所指向的第一个元素的地址一样。

例如:

int numbers[];
int *p;

下面的赋值是合法的:

p=number;

这里指针p 和numbers 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而numbers 总是指向被定义的20个整数组中的第一个。所以,p是一个普通的指针变量,而与之不同,numbers是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是:

numbers = p;

因为number 是一个数组(指针常量),常量标识不可以被赋其它数值。

//数组(常量指针)指向内存中一段连续的地址空间
#include <iostream.h>
int main () {
int numbers[];
int * p;
p = numbers; //把数组numbers的首地址赋值给指针变量p
*p = ;             //通过指针p给数组的第一个元素赋值为10
p++;                //指针地址值加上一个整型变量所占的内存大小
*p = ;              //给数组的第二个元素赋值
p = &numbers[];           
*p = ;              //给数组的第三个元素赋值
p = numbers + ;
*p = ;              //给数组的第三个元素赋值
p = numbers; *(p+) = ;
for (int n=; n<; n++)     //输出数组的所有元素值
cout << numbers[n] << ", ";
return ;
}

(4)指针的数学运算

对指针只有加法和减法运算,其它运算在指针世界里没有意义。但是指针的加法和减法的具体运算根据它所指向的数据的类型的大小的不同而有所不同。我们知道不同的数据类型在内存中占用的存储空间是不一样的。例如,字符char 占用1 个字节(1 byte),短整型short 占用2 个字节,长整型long 占用4个字节。

假设我们有3个指针:

char *mychar;
short *myshort;
long *mylong;

同时,假设他们分别指向内存的地址为1000, 2000 和3000。当他们分别进行自加运算后的效果如下:

mychar++;             //mychar的地址变为1001
myshort++; //myshort的地址变为2002
mylong++; //mylong的地址变为3004

需要注意的是:递增 (++) 和递减 (--) 操作符比引用操作符reference operator (*)有更高的优先级

*p++;          //等同于(*(p++)),它所作的是增加p (它所指向的地址,而不是它存储的数值)
*p++ = *q++;      //两个递增操作(++) 都是在整个表达式被计算之后进行而不是在之前,所以*q 的值首先被赋予*p ,然后q 和p 都增加1,
//它相当于:
*p = *q;
p++;
q++;

C++指针学习笔记的更多相关文章

  1. C++中的智能指针、轻量级指针、强弱指针学习笔记

    一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...

  2. C++学习 - 虚表,虚函数,虚函数表指针学习笔记

    http://blog.csdn.net/alps1992/article/details/45052403 虚函数 虚函数就是用virtual来修饰的函数.虚函数是实现C++多态的基础. 虚表 每个 ...

  3. 深入理解C指针----学习笔记

      深入理解C指针     第1章 认识指针   理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址.     1.1 指针和内存   C程序在编译后,以三种方式使用内存: 1. 静态. ...

  4. <c和指针>学习笔记6输入输出函数

    1 错误报告 (1)perror函数 void perror(char const *message) error是标准库的一个外部整型变量(errno.h),保存错误代码之后就会把这个信息传递给用户 ...

  5. <c和指针>学习笔记5动态内存分配和预处理器

    1 动态内存 比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了.从而引入动态分配,需要的时候再分配. (1)malloc和free void *malloc(size_t ...

  6. <c和指针>学习笔记3之函数和数组

    1 函数声明 (1)原型 告诉编译器函数的参数数量和每个参数的类型以及返回值的类型.编译器通过检查原型之后,就可以检查这个函数得调用,从而来确保参数正确,返回值无误. 通用技巧,将原型写在一个头文件当 ...

  7. <c和指针>学习笔记3之操作符,表达式与指针

    1 操作符 (1)移位操作符 左移<<:值最左边的几位丢弃,右边多出来的几个空位用0补齐 01101101 011(丢弃)01101000(后面三位补0) 右移>>: 算术左移 ...

  8. C与指针学习笔记

    有些任务无法用其他语言实现,如直接访问硬件,但C却可以. C对数组下标引用和指针访问并不进行有效性检查,这可以节省时间,但你在使用这些特性时,就必须特别小心.

  9. C++的智能指针学习笔记(初)

    C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...

随机推荐

  1. UVa1424–Salesmen(DP)

    题目大意 给定一个包含n(n<=100)个点的无向连通图和一个长度为L的序列A(L<=200),你的任务是修改尽量少的数,使得序列中的任意两个相邻的数或者相同,或者对应图中两个相邻结点 题 ...

  2. Nexus5如何手动OTA更新系统到4.4.3、4.4.4及常见问题回答

    这里将记录一套行之有效的Nexus5手动升级方法,以帮助看见这篇文章的朋友成功将手头的Nexus5升级到4.4.4. 因为谷歌服务器的事,我的这次OTA更新起来走了很多弯路.我试过挂VPN等待系统来更 ...

  3. 局域网内Linux服务器时间同步

    局域网内Linux服务器时间同步   1.将一台能够上网的服务器作为时间服务器:  # /usr/bin/rdate -s time-b.timefreq.bldrdoc.gov //将时间服务器与互 ...

  4. 统一建模语言(UML) 版本 2.0

    原文: http://www.ibm.com/developerworks/cn/rational/321_uml/ 简介 参考 UML 基础系列的其他文章和教程 UML基础: 统一建模语言简介 UM ...

  5. Tsar 服务器系统和应用信息的采集报告工具

    Tsar介绍 Tsar是淘宝的一个用来收集服务器系统和应用信息的采集报告工具,如收集服务器的系统信息(cpu,mem等),以及应用数据(nginx.swift等),收集到的数据存储在服务器磁盘上,可以 ...

  6. [转] JAVA正则表达式:Pattern类与Matcher类详解(转)

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和 Matcher Pattern 一个Pattern是一个正则表达式经编译后的 ...

  7. java窗体与Flash交互

    最近在研究flash,用flash去读取文件很简单,但是存储文件就很麻烦了. 因此想到用java的窗体进行交互. 下面是DJNativeSwing-SWT-1-0-3-20140708的下载链接: h ...

  8. 动态添加组件(XML)

    1.利用LayoutInflater的inflate动态加载XMLmLinearLayout = (LinearLayout)findViewById(R.id.LinearLayout_ID);La ...

  9. Magento的布局(Layout),块(Block)和模板(Template)

    public function indexAction() { //remove our previous echo //echo 'Hello Index!'; $this->loadLayo ...

  10. javascript-03

    1.Object   |-1.var  变量=new Object();         |-变量.自定义的属性='值';     |-变量.自定义名称=function(){}   |-2.var ...