一、指针基本概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。学习指针必须了解如下四个内容:
1指针的类型:去掉标识符,指针的类型对于机器而言都是一样的
2指针指向的类型:去掉标识符和左边的*
3指针的值:一个32位的数值(一般是内存地址)
4指针指向的内存区域:指针的值代表指针指向内存区域的首地址,指针指向的类型决定了该内存区域的大小。指针的移位操作和指针指向的类型有关动,指针一次移动一个sizeof(指针指向的类型)大小。
(1)int*ptr
=0;//指针的类型是int*
指针所指向的类型是int,指针的值为0(非法地址)表示指针未指向合法内存。
(2)int**ptr;//指针的类型是int** 指针所指向的的类型是int*
(3)int(*ptr)[3];//指针的类型是int(*)[3] 指针所指向的的类型是int()[3]
(4)int*(*ptr)[4];//指针的类型是int*(*)[4] 指针所指向的的类型是int*()[4]
二、指针相关的运算:
1&:取地址运算符,返回结果是一个指针(地址值都可以转换为指针),&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址,就是a的地址。
2*:间接运算符, *p的结果是p所指向的内存代表的值,它的类型是p指向的类型,它所占用的地址是p所指向的地址,他的值是p指向内存的值。
当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。
三、指针和数组
数组的数组名其实可以看作一个指针。一般而言数组名array代表数组本身,类型是int[10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int*,所指向的类型是数组单元的类型即int。声明了一个数组TYPEarray[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)测出的是指针类型的大小。
四、指针安全
在操作指针时,一定要明确指针的类型和指针指向的内存区域。指针导致的常见错误:
1 当指针值为非法内存地址(通常是未对指针初始化或者使用非法数据转换为指针值)对地取地址操作会导致“内存不可read”错误;
2 当指针指向内存区域未被分配时,会导致“内存不可write”错误。
来源:https://www.cnblogs.com/magiclee/archive/2008/07/11/1241106.html