您的位置:首页 > 其它

数组 与 指针 之间的关系 分析

2017-02-10 13:14 381 查看

数组的本质

数组是一段连续的内存空间

数组的空间大小为:sizeof(array_type) * array_size

数组名可看做指向数组第一个元素的常量指针

指针的运算

指针是一种特殊的变量,既然是变量就可以参与运算。

与整数的运算规则为:



当指针p指向一个同类型的数组的元素时:p+1将指向当前元素的下一个元素;p-1将指向当前元素的上一个元素。

指针之间只支持减法运算且必须参与运算的指针类型必须相同



只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差。

当两个指针指向的元素不在同一个数组中时,结果未定义,没有意义。

举例说明:

#include <stdio.h>
#include <malloc.h>

int main()
{
char s1[] = {'H', 'e', 'l', 'l', 'o'};
int i = 0;
char s2[] = {'W', 'o', 'r', 'l', 'd'};
char* p0 = s1;
char* p1 = &s1[3];
char* p2 = s2;
int* p = &i;

printf("%d\n", p0 - p1);//-3
printf("%d\n", p0 + p2);//报错
printf("%d\n", p0 - p2);//不确定
printf("%d\n", p0 - p); //报错
printf("%d\n", p0 * p2);//报错
printf("%d\n", p0 / p2);//报错

return 0;
}


指针的比较

指针也可以进行关系运算 <, <=, >, >=

指针关系运算的前提是同时指向同一个数组中的元素

任意两个指针之间的比较运算(==, !=)无限制

举例说明:

#include <stdio.h>
#include <malloc.h>

#define DIM(a) (sizeof(a) / sizeof(*a))

int main()
{
char s[] = {'H', 'e', 'l', 'l', 'o'};
char* pBegin = s;
char* pEnd = s + DIM(s);
char* p = NULL;

for(p=pBegin; p<pEnd; p++)
{
printf("%c", *p);
}

printf("\n");

return 0;
}


数组的访问

数组的下标可以为负数,编译可通过,只是无意义

以下标的形式访问数组中的元素:



 以指针的形式访问数组中的元素:



从理论上而言,当指针以固定增量在数组中移动时,其效率高于下标产生的代码

当指针增量为1且硬件具有硬件增量模型时,表现更佳。

现代编译器的生成代码优化率已大大提高,在固定增量时,下标形式的效率已经和指针形式相当;但从可读性和代码维护的角度来看,下标形式更优。

a和&a的区别(a为数组)

a为数组是数组首元素的地址

&a为整个数组的地址

a和&a的意义不同其区别在于指针运算



例题分析

#include <stdio.h>

int main()
{
int a[5] = {1, 2, 3, 4, 5};
int* p1 = (int*)(&a + 1);
int* p2 = (int*)((int)a + 1);
int* p3 = (int*)(a + 1);

printf("%d, %d, %d\n", p1[-1], p2[0], p3[1]);

return 0;
}
//有下列选项:
// A. 数组下标不能是负数,程序无法运行
// B. p1[-1]将输出随机数,p2[0]输出2, p3[1]输出3
// C. p1[-1]将输出乱码, p2[0]和p3[1]输出2


数组的下标可以为负数,上述ABC都不对





p1[-1] = a[4] = 5

p2[0] = 0x 02 00 00 00 = 33554432

p3[1] = 3 此处注意p3[1]不是p3[0]

数组作为函数的参数

C语言中,数组作为函数参数时,编译器将其编译成对应的指针,所以本质上说,没有数组参数,只有指针参数。



结论:

一般情况下,当定义的函数中有数组参数时,需要定义另一个参数来标示数组的大小。

举例说明:

#include <stdio.h>

int f(int* a,int c)
{
return *(a+c-1);
}

int main()
{
int a[5] = {0,1,2,3,4};
int b = f(a,5);
printf("%d\n", b);//输出4
return 0;
}


指针和数组的对比

数组声明时编译器自动分配一片连续内存空间。

指针声明时只分配了用于容纳指针的4字节空间。

在作为函数参数时,数组参数和指针参数等价。

数组名在多数情况可以看做常量指针,其保存的地址值不能改变。

指针的本质是变量,保存的值被看做内存中的地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 数组