一级指针
- int *p 这里定义了一个指针变量p,p里存储的内存地址处的内存称为p所指向的内存,p里的任何数据都当做地址处理。
指针就是变量,用来存放地址的变量。指针的大小在32位平台是4个字节,在64位平台是8个字节。
2.指针的定义方式是: type * ,type只是说明指针所指向的内存里存储的数据类型。指针类型的意义:
指针±整数:±的大小取决于其所指向的类型。如char p;p+1则代表加一个字节,int p;p+1则是加4个字节。
指针的解引用: 指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。 比如: char 的指针解引用就
只能访问一个字节,而 int 的指针的解引用就能访问四个字节。
指针运算
二级指针
char **p;定义了一个二级指针变量 p。p 是一个指针变量,毫无疑问在 32 位系统下占 4 个 byte。它与一级指针不同的是,一级指针保存的是数据的地址,二级指针保存的是一级指针的地址。
指针和数组
指针和数组没有关系!!!
指针就是指针,32位系统下永远占4个字节,其值为某一个内存的地址。
数组就是数组,是一组具有相同数据类型元素的集合。其大小与元素的个数和类型有关。
下面我们就详细讨论讨论它们之间似是而非的一些特点。例如,函数内部有如下定义:
A),char*p = “abcdef”;
B),chara[]= “123456”;
以指针的形式访问指针:(p+4),先取出 p 里存储的地址值,然后取出加上 4 个字符的偏移量地址上的值。
以下标的形式访问指针:p[4], 编译器总是把以下标的形式的操作解析为以指针的形式的操作。p[4]这个操作会被解析成:先取出 p 里存储的地址值,然后加上中括号中 4 个元素的偏移量,计算出新的地址,然后从新的地址中取出值。
以指针的形式访问数组:(a+4)。a 这时候代表的是数组首元素的首地址,然后加上 4 个字符的偏移量,得到新的地址 ,然后取出地址上的值。
以下标的形式访问数组:a[4]。编译器总是把以下标的形式的操作解析为以指针的形式的操作。a[4]这个操作会被解析成:a 作为数组首元素的首地址,然后加上中括号中 4 个元素的偏移量,计算出新的地址,然后从新的地址中取出值。
由上面的分析,我们可以看到,指针和数组根本就是两个完全不一样的东西。只是它们都可以“以指针形式”或“以下标形式”进行访问。一个是完全的匿名访问,一个是典型的具名+匿名访问。偏移量的单位是元素的个数偏移量的单位是元素的个数而不是 byte 数,在计算新地址时千万别弄错了。
指针数组
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
int p1[10];p1 先与“[]”结合,构成一个数组的定义,数组名为 p1,int修饰的是数组的内容,即数组的每个元素。