C++指针学习笔记
本文参考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++指针学习笔记的更多相关文章
- C++中的智能指针、轻量级指针、强弱指针学习笔记
一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...
- C++学习 - 虚表,虚函数,虚函数表指针学习笔记
http://blog.csdn.net/alps1992/article/details/45052403 虚函数 虚函数就是用virtual来修饰的函数.虚函数是实现C++多态的基础. 虚表 每个 ...
- 深入理解C指针----学习笔记
深入理解C指针 第1章 认识指针 理解指针的关键在于理解C程序如何管理内存,指针包含的就是内存地址. 1.1 指针和内存 C程序在编译后,以三种方式使用内存: 1. 静态. ...
- <c和指针>学习笔记6输入输出函数
1 错误报告 (1)perror函数 void perror(char const *message) error是标准库的一个外部整型变量(errno.h),保存错误代码之后就会把这个信息传递给用户 ...
- <c和指针>学习笔记5动态内存分配和预处理器
1 动态内存 比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了.从而引入动态分配,需要的时候再分配. (1)malloc和free void *malloc(size_t ...
- <c和指针>学习笔记3之函数和数组
1 函数声明 (1)原型 告诉编译器函数的参数数量和每个参数的类型以及返回值的类型.编译器通过检查原型之后,就可以检查这个函数得调用,从而来确保参数正确,返回值无误. 通用技巧,将原型写在一个头文件当 ...
- <c和指针>学习笔记3之操作符,表达式与指针
1 操作符 (1)移位操作符 左移<<:值最左边的几位丢弃,右边多出来的几个空位用0补齐 01101101 011(丢弃)01101000(后面三位补0) 右移>>: 算术左移 ...
- C与指针学习笔记
有些任务无法用其他语言实现,如直接访问硬件,但C却可以. C对数组下标引用和指针访问并不进行有效性检查,这可以节省时间,但你在使用这些特性时,就必须特别小心.
- C++的智能指针学习笔记(初)
C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...
随机推荐
- 我理解的RPC
这两天在学习公司一牛人写的RPC框架,一直都对RPC的概念很模糊,现在稍微清晰了些. rpc定义:RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一 ...
- linux Grant 添加 MySql 用户
Grant 添加 MySql 用户 2009-04-03 14:40 我安装的版本: mysql> select version();+------------+| version() |+ ...
- hdu3681--Prison Break(TSP+二分)
好难的一道题. 题意:一个机器人要逃出监狱,每走一步消耗一点电量,初始时电量是满的.给一个n*m(n,m<=15)的字符数组代表监狱,F代表起始点,G代表补充满电量,每个G只能补充一次,Y代表开 ...
- FireFox浏览器的下载和安装、借助RamDisk让你的FireFox飞起来
想说的是,为什么我要写此博文,算是纪念我对FireFox浏览器的一个入门.最近,开始接触了它,看到了很多IT牛人极力推荐使用 “ FireFox浏览器 ”作为开发. 深得大牛指导! 下载 安装 这是, ...
- Redis在PHP中的基本使用案例
下载http://www.oschina.net/p/redis 解压后里面有:lib 源文件 .examples 例子.test测试 将lib目录拷贝到你的项目中,就可以开始你的predis操作了. ...
- A Tour of Go If
The if statement looks as it does in C or Java, except that the ( ) are gone and the { } are require ...
- 拼接<a>标签相关属性
<s:iterator value="#session.funcs" id="sonbean"> <s:if test="%{#so ...
- 树莓派(Rospberry Pi B+)到货亲測
1 图鉴 Rospberry Pi B+最终在今天下午有蜗牛快递公司圆*送到了.B+主要是添加了2个USB,添加了GPIO,sd卡换成了micro sd ...先不说直接上图再说,期待了好久好久 w ...
- 开发XMPP IM
Openfire 是一个用Java 实现的XMPP 服务器,客户端可以通过IQ的方式与其进行通信(其实就是XML),客户端和服务器之间的通信是依靠底层Smack 库提供的各种功能来完成的.其实利用插件 ...
- Linux 的启动流程-阮一峰
http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html