指针和数组的对比

数组和指针具有相似的性质,数组名就是数组的首地址,数组名可以加*做指针运算,同时指针也可以像数组一样加下标,但不要根据这些事实做出数组和指针是相同的结论,他们具有一些不同的性质,下面做一些探讨。声明以下变量

int x = 0;
int *p =&x;
int vector[7] = {0,1,2,3,4,5,6};

下标[n]操作和操作
x是一个整形变量,指针变量p保存了变量x的地址,p的值就是x的地址。vector[]是整形数组,vector是数组名,可以作为数组首地址常量进行计算操作。即&vector[0]和vector是等同的,vector[0]和vector是等同的。数组名可以使用下标和运算。同样指针变量也可以使用下标和操作,即p和p[0]是等同的。不过要注意p+1是野指针,因此
(p+1)和p[1]是危险的。
##sizeof操作
在c语言中,sizeof()是判断数据类型长度的关键字,值以字节为单位。sizeof的处理都是在编译阶段进行,他是一个编译器相关的操作,结果受编译器影响。
对于指针变量p,sizeof§是地址的长度,和p指向的类型无关,在一个系统内,所有的指针的长度都是一样的。在64位系统中,地址的长度是8(单位是Byte),
//操作系统为centos7 64位,gcc
printf(“sizeof(void *) is %d Byte”,sizeof(void *));

输出sizeof(void) is 8 byte。
而对于数组变量vector,sizeof(vector)的结果是整个数组在内存中占用的空间,而不是数组地址长度8,即sizeof(vector)等同于sizeof(vector[0])数组元素个数。 vector不是指向数组的指针,&vector才是这想数组的指针,sizeof(&vector)结果为8(64位系统中)
加减运算
对于指针p,p+1运算,p的值实际上增加了它指向类型的大小。64位操作系统中,指针的长度为64位。所以指针变量p的值即为(unsigned long)p,强制转化为unsigned long型。也就是说,对于例子中的int p = &x;(unsigned long)(p+1)-(unsigned long)p等同于sizeof(int)。对于数组指针&vector,(unsigned long)(&vector+1)-(unsigned long)(&vector)等同于sizeof(vector)。
总结
对于数组变量来说,数组名具有一些指针的性质,可以使用
号得到某个元素的值,但是sizeof(vector)的得到的是数组的大小,而不是指针 的大小,&vector才是指向数组的指针。指针变量p的值是它指向数据的地址,同时变量p本身也占有内存(&p处)。数组名可以做数组 首地址使用,但数组名不是指针变量,定义一个数组变量占用的空间只有它所有的元素占用的空间之和。
测试代码
环境centos7 64,gcc编译器
#include<stdio.h>

int main(int argn,char * argv[])
{
int a[5] = {0,1,2,3,4};
int ptr = (int)((&a)+1);
int k = (ptr-1);
printf(“sizeof(unsigned long)的值是%d\n”,sizeof(unsigned long));
printf("a:%d\n",a);
printf("
(a+1):%d\n",
(a+1));
printf(“a的值是 %p\n&a的值是%p\n”,a,&a);
printf("sizeof(char
):%d\n",sizeof(char*));
printf(“sizeof((int*)0x00):%d\n”,sizeof((int*)0x00));
printf(“sizeof(ptr):%d\n”,sizeof(ptr));
printf(“sizeof(&a):%d\n”,sizeof(&a));

printf("int类型的长度是%d\n",sizeof(int));
printf("(unsigned long)(&k+1)-(unsigned long)(&k)的值是%d\n",(unsigned  
long)(&k+1)-(unsigned long)(&k));

printf("数组的大小sezeof(a)是%d\n",sizeof(a));
printf("(unsiged long)(&a+1)-(unsigned long)(&a)的值是%d\n",(unsigned  
long)(&a+1)-(unsigned long)(&a));
printf("&a+1的值是%p\n",&a+1);
printf("a+5的值是 %p\n",a+5);
printf("k的值是%d,k==a[4]\n",k);
return 0;

}

在这里插入图片描述

输出结果

在这里插入图片描述
2017-12-24 11:48:29 星期日 用markdown重写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值