C++学习笔记(五):指针

声明指针:

1 //指针声明 * 号左右的空格是可选的,下面的定义都是正确的
2 int *pointer1;
3 int* pointer2;
4 int*pointer3;
5 int * pointer4;
6 //注意: pointer5 是指针而 pointer6 不是
7 int *pointer5, pointer6;
8 //pointer7 和 pointer8 都是指针
9 int *pointer7, *pointer8;

指针的类型和指针所指向的类型:

1 //指针的类型是int*,表示为int对象的指针
2 //指针所指向的类型是int,表示该指针指向int对象
3 int *pointer1;

指针的值:

指针表示指向对象位于内存中的地址,对于32位的系统来说就是一个无符号的32位数字(最多表示4GB内存),64位系统就是一个无符号的64位数字;

取地址和取值:

取一个对象的地址使用&符号,取一个指针指向的对象的值使用*符号;

1 int num = 100;
2 int *p = #
3 p = 101;//错误, 这是直接改变指针的指向,指向内存地址101
4 *p = 101;//正确, 修改了num的值

空指针:

表示这个指针没有指向一块有意义的内存,对空指针应用delete是安全的。

1 //没有赋值的指针
2 int *p;
3 //赋值为NULL或0的指针
4 int *p = NULL;
5 int *p = 0;

指针的算术运算:

指针的加减法会以sizeof(指针指向的类型)来处理,比如:

1 int num = 100;
2 int *p = #
3 p++;//指针的地址指向+4之后的位置
4 ptr += 5;//指针的地址指向+20之后的位置

指向指针的指针:

指针同样可以指向另一个指针,

1 int **ptr;//指向一个int类型指针的指针

指针和数组:

数组的数组名其实可以看作一个指针,

1 int array[10]={0,1,2,3,4,5,6,7,8,9},value;
2 value=array[0];//也可写成:value=*array;
3 value=array[3];//也可写成:value=*(array+3);
4 value=array[4];//也可写成:value=*(array+4);

在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。

在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。

在很多情况下,可以相同的方式使用指针名和数组名。对于它们,可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,它们都表示地址。区别之一是,可以修改指针的值,而数
组名是常量。

成员调用:

结构变量.成员名

(*结构指针变量).成员名

结构指针变量->成员名

时间: 2024-10-11 21:42:29

C++学习笔记(五):指针的相关文章

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro

小猪的数据结构学习笔记(五)

小猪的数据结构学习笔记(五) 线性表之--循环链表                           --转载请注明出处:coder-pig 循环链表知识点归纳: 相关代码实现: ①判断是否为空表: ②单循环链表的存储结构 其实和单链表的结构是一样的! /*定义循环链表的存储结构*/ typedef struct Cir_List { int data; struct Cir_List *next; }Lnode; ③初始化循环单链表 代码如下: //1.循环链表的初始化 //表示一个元素,如

Boost Thread学习笔记五

多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thread库为我们提供了一个接口简单的TLS的面向对象的封装,以下是tss类的接口定义: class tss{public:    tss(boost::function1<void, void*>* pcleanup);    void* get() const;    void set(void*

Lua学习笔记(五):函数

函数有两种用途: 1).完成指定的任务,这种情况下函数作为调用语句使用: 2).计算并返回值,这种情况下函数作为赋值语句表达式使用. 1 function func_name (arguments-list) 2 statements-list; 3 end; 4 5 --调用函数的时候,如果参数列表为空,必须使用()表明是函数调用 6 print(8*9, 9/8) 7 a = math.sin(3) + math.cos(10) 8 print(os.date()) 9 10 --上述规则有

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

学习笔记:指针之C

因为某些原因来好好的将C重新梳理一遍,过去一年也是个渣,好在还能重新来过.将C和指针中指针一节学习了三四次,再将后面的习题做了一做.现在再好好回顾一下.至于对错就不过多评价. 指针的确是C的特点之一,从最初接这玩意就没把它弄的很明白.据说把它真正吃透的人也不多.这也只是我的学习笔记.指针,记得当初C语言老师说的一点,就是地址,其他就没啥印象了.自从自己做题就是记住了这点,指针就是地址,访问相应内存空间的值是间接访问,要用' * ',也叫解引用指针. 通过C和指针这本参考书,我才知道我们是用变量来

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J

java之jvm学习笔记五(实践写自己的类装载器)

java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先定义自己的类装载器,从Clas

WEB前端学习笔记 五

接web前端学习笔记第四篇,此篇为web学习笔记 五,在此感谢您的采集和转发,但请注明文章出自网知博学. 2.0.3  html标签的属性格式 现在我们知道了两个双标签分别是,标题标签:<h1> - <h6>.和段落标签:<p></p>还知道了一个换行的单标签:<br />,现在我们给<p></p>标签添加一个属性,来改变段落是右对齐,还是左对齐,还是居中. 如上图,<p>标签中的 align(中文就是排列的意