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又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...
随机推荐
- PHP字符串操作常用函数
/* * 确定字符串长度 * int strlen(string str) * 比较两个字符串 * 1.strcmp函数对两个字符串进行二进制安全的比较,并区分大小写 * int strcmp(str ...
- ZOJ-2365 Strong Defence 贪心,BFS
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2365 我没看懂题目...这样理解:一个有向图,要给一些边染色,使 ...
- 利用系统镜像文件安装.Net框架的方式
最近重装系统之后,在安装部分程序时需要.NET3.5框架,在线安装时间较长,网上搜到了一个很好的解决办法.利用windows系统镜像.首先将镜像加载到驱动中比如L,然后在cmd中输入 dism.exe ...
- ndk-gdb of NDK r9d modified to *always* debug the ":remote"-process of your app
https://gist.github.com/TomTasche/9690186 ndk-gdb of NDK r9d modified to *always* debug the ":r ...
- 北京Uber优步司机奖励政策(2月6日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Laravle Introduction
Where To Start Learning a new framework can be daunting, but it's also exciting. To smooth your tran ...
- hdu 3724 Encoded Barcodes
Trie模板.把所有单词都用字典树存起来,然后给每个节点赋权值表示前缀到该节点出现了几次.然后直接查询就可以了. #include <algorithm> #include <ios ...
- 用Quartus II 建立一个工程模板,以后新建工程时无需再配置参数
以前用Quartus II 每次新建工程时,都要设置工程名,选择工程路径,选择芯片型号等等,好麻烦呀!可不可以建一个工程模板,以后新建工程时直接改相应文件名就可以呀!后来我一琢磨,感觉也不是不可以.因 ...
- MonkeyRunner源码分析之工作原理图
http://www.androidchina.net/1315.html
- 标准I/O的替代软件
标准I/O并不完善. 标准I/O库的一个不足之处是效率不高,这与它需要复制的数据量有关.当使用每次一行函数fgets和fputs时,通常需要复制两次数据:一次是在内核和标准I/O缓冲之间(当调用rea ...