本帖最后由 why19910522 于 2015-8-9 21:35 编辑
指针 1.定义:一是指一种存储地址的数据类型,二是一种保存地址的变量 2.作用:用于存储某一个地址,从而可以通过地址直接对地址所对应的内存空间里的数据进行操作 3.怎么用: 定义:类型 *指针名;如 int *p;表示定义一个可以存储int类型地址的指针变量,叫p 赋值:指针变量名 = 变量地址。如int a = 12;int *p = &a; 4.何时用:当需要存储指针,以便于操作该地址及该地址对应的数据 5.特点: 指针本身也有地址,指针定义后,其自身地址不变,但是里面的存储的地址可以改变 ##&p表示指针自身的地址,而p表示指针存储的地址,*p表示指针所存地址的内存空间。*p等效于指针p所存地址对应的空间的变量名,也就是说*p可以当变量使用。变量能做什么事情,那么*p也就能做什么事情。
指针不初始化赋值,不要使用,未赋值前地址时随机的,未赋值不可以用*p
"*"修饰什么就表示时什么类型的指针。判断原则:先确定变量的类型(根据符号优先级)
指针是什么类型,就应该存什么类型的地址,否则*p去对应内存空间的值会出错。
指针与数组 1.指针的数组 首先这是一个数组,然后这个数组是用来存储指针的,那么就叫做指针数组。这个数组里面的元素是指针。这个数组里的元素存放的是指针存储的地址,而不是指针本身的地址。 2.数组的指针 这是一个指针,它的类型是数组类型,用来存储一个数 组的地址。 写法:如int (*p)[3];其中小括号必须有,否则就是指针的数组而不是数组的指针了 取值:(*p)[1] = 23;(注意:小括号不能丢!!!当写成*p[1]时,代表的是指针数组的第二个元素) 3.指针的数组和数组的指针,其写法的区别以及原因 写法: 指针的数组:int *p[3]; 数组的指针:int (*p)[3]; 原因:因为在计算机中,'[ ]'的优先级高于'*',所以没有小括号时p会先与'[ ]'结合,成为一个数组,然后'*'和int结合成为'int *','int *'用来修饰数组,则此种情况下称为指针的数组。 当存在小括号时,因为'()'和'[ ]'属于同一优先级且是左结合,那么此时p和'*'先结合,成为一个指针,然后'[ ]'和'int '结合成'int [ ]','int [ ]'用来修饰'*p',则此种情况下称为数组的指针。 4.数组元素的指针 这是一个指针,它存储的是一个数组元素的地址。 5.特点 数组名表示数组第一个元素的地址,&数组名表示整个数组的地址。二者值相同但意义不同。 指针可以运算,但只有加减运算。运算的实质时地址的运算,既地址的移动。指针的运算改变的是指针存储的那个地址,而不是指针本身的地址。 指针的运算:当是加法时,地址向高位移动;减法时,地址向低位移动。不同指针类型移动一位(+1或-1)的字节数的不同。实际移动的字节数看指针类型,类型占多少个字节一位就移动多少个字节。 指针的运算移动时,只要是在内存范围内的就不受限制,且不会报错。指针的运算只管地址的移动,并不会管移动后是否会越界。 下图中*(intP-1)的小括号不能丢!若写成*intP-1,则代表*intP的值减1,因为'*'的优先级高于'-'。*(intP-1)等效于intArr[1-1],而*intP-1等效于intArr[1]-1。 下方第二个图为错误的写法 |