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又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...
随机推荐
- git高级应用
高级应用之一: 二分法查找错误版本: 当前日志 $ git log --oneline ccda9d2 added test1 dd518f7 test zu 88095f9 dasfdasf 3 ...
- HW4.12
public class Solution { public static void main(String[] args) { int n = 0; while(n * n < 12000) ...
- <a href> 带有cookie
<a href = <s:url action="exam/examAction_startExam.action" > <s:param name=&qu ...
- maven 通过nexus创建工厂的配置
访问中央工厂的地址:http://localhost:8081/nexus/index.html#welcome admin.admin123 查找到自己配置的maven仓库的位置,编辑setti ...
- XML Drawable与9-Patches
可绘制对象资源 两种设计工具均属于drawable.Android把任何可绘制在屏幕上的图形图像都称为drawable drawable可以是一种抽象的图形.一个继承 Drawable 类的子类,或者 ...
- C++ 实现按随意键继续~~~
近期让学生敲代码交作业的时候要求他们仅仅给我交个cpp文件和一个exe文件,这样交上来的东西不至于太多,不占我的地方,可是有一个问题是exe它总是执行完后就直接关闭界面了,看不到执行结果的界面. 然后 ...
- Kinect开发学习笔记之(一)Kinect介绍和应用
Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...
- Linux系列:Ubuntu虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)
虚拟机里设置上网方式为NAT最方便,因为无需手动设置即可上网,但是NAT的上网方式默认是DHCP动态分配IP的,这意味着你每次重启虚拟机都 有不一样的IP地址,这对一般用户没任何问题.但是如果你的机子 ...
- java12 File类
)File类 )IO流的原理及概念 )IO流的分类 )IO流类的体系 )字节流和字符流 )处理流 )文件拷贝 )处理流 )文件拷贝 )文件分割与合并 File:文件和目录路径名的抽象表示形式,一个Fi ...
- careercup-递归和动态规划 9.11
9.11 给定一个布尔表达式,由0.1.&.|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式得出result值. 解法: 跟其他递归问题一样 ...