zoukankan      html  css  js  c++  java
  • 指针学习笔记

    ref:http://www.cnblogs.com/ggjucheng/archive/2011/12/13/2286391.html

    指针的类型:去掉指针声明语句里的指针名字即为指针的类型。

    指针的类型是指指针本身所具有的类型

    指针所指向的类型:去掉指针声明语句中的指针名字和名字左边的指针声明符*。

    指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待

    指针的类型和指针所指向的类型是不同的概念。

    指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。

    指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。

    指针本身所占据的内存区:函数sizeof(指针的类型)。在32位平台里,指针本身占据了4个字节的长度。

    指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。

    一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

    运算符&和*:&是取地址运算符,*是“间接运算符”。&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址是a的地址。*p的结果是p所指向的东西,它的类型是p指向的类型,它所占用的地址是p所指向的地址。

    指针表达式:一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。

    由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。
    当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。

    数组和指针的关系:数组的数组名其实可以看作一个指针。

    声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。

    在不同的表达式中数组名array可以扮演不同的角色。 
    在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。 
    在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。 
    表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。sizeof(对象)测出的是对象自身的类型的大小。

    指针和结构类型的关系:可以声明一个指向结构类型对象的指针。

    所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是其他对齐,需要在相邻两个成员之间加若干个“填充字节”,这就导致各个成员之间可能会有若干个字节的空隙。

    指针和函数的关系:可以把一个指针声明成为一个指向函数的指针。可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。

  • 相关阅读:
    VECTOR的用法
    【转】C/C++中的Split函数(字符串自动分割)
    【转】动态树
    【实验】vector性质
    【转】Android操作系统安全研究系列——键盘记录
    D8神贴
    【操作系统】修改WIN7下的文件关联与默认程序
    【转】探寻C++最快的读取文件的方案(方法未论证)
    如何在60分钟之内过掉600个单词
    【转】动态树:实现
  • 原文地址:https://www.cnblogs.com/codingutopia/p/pointer.html
Copyright © 2011-2022 走看看