参考资料:html
数组:能用索引访问的同质元素连续集合(内存连续)git
咱们能够把数组下标用在指针上,即:
*(p + i)
等价于 p[i]
github
指针的加减运算对于数组一样实用,即数组名加减整数:
*(p + i)
等价于 *(array + i)
编程
1.array[i]
与 *(array+i)
结果相同,生成的机器码却不一样(存在异议,待修正)数组
array[i]
:从 array
位置开始,移动 i
个位置,再取出内容*(array+i)
:从 array
位置开始,在地址上增长 i
,而后取出这个地址中的内容2.sizeof
操做符对他们的操做不一样
有代码例如3d
int array[5] = {1,2,3,4,5}; int *p = array;
则指针
sizeof(array)
:返回20,即数组分配的字节数 4X5sizeof(p)
:返回4,即指针长度int (*p)[4]
,p
即为指向数组的指针有代码以下:code
int array[3][4]; int (*p)[4]; p = array;
p
与 p+1
与 ++p
:p
是一个int型数组(长度4)的指针,p+1
是另外一个int型数组(长度为4)的指针,经过一个 p
能够读取 array[]
的内容,++p
同理
htm
p
读取 array[0]
:当数据类型匹配时,能够理解为 *p
内的 *p+0,*p+1,*p+2,*p+3
对应读取array[0][1],array[2]...
blog
p+1
读取 array[1]
:当数类型匹配时,同理读取 array[1]
的内容
当 *p
与 array[]
数据类型不匹配:即array[3][4]
与 (*p)[5]
,由于*p
为5个int的数组,在p
读取array[0]
时,*p+4
占据了 array[1][0]
,在p+1
读取array[1]
时,则从array[1][1]
开始读取,产生其余结果,但这并不算错误,而是警告[Warning] assignment from incompatible pointer type [-Wincompatible-pointer-types]
。同理,当*p
内元素少于数组,则提早读取
总结(前提为数据类型匹配):
p+i 与 *p+i
:一个指向第 i
数组首位元素,一个指向 1
数组的第i
个元素*p[n] 与 (*p)[n]
:优先级() > [] > *
,一个是p[n][0]/array[n][0]
,一个为p[0][n]/array[0][n]
代码示例:数组指针.c
int *p[4]
p
是指向 int 的指针的数组(元素个数4)。指针数组中的每个元素均为指针有代码以下:
#define Len 5 char *p1[Len] = {"ONE","TWO","THREE","FOUR","FIVE"}; char var[Len][6] = {"one","two","three","four","five"}; char *p2[Len];
var
:当定义了一个二维数组后,不管赋不赋值,系统都会给它分配固定的空间,并且该空间必定是连续的。咱们能够经过指定下标对其元素进行修改p1
:建立指针数组后,分配的空间则取决于具体字符串的长度,但该空间不必定是连续的,且不能经过下标对其元素进行修改var
内个元素大小取决于最长元素(three\0)
为6字节,故总大小 5x6=30,此外,对指针数组 p1
元素进行sizeof()
实计算的是 int *
,故总大小为 5x4=20\0
填充,var
内的剩余空间亦是