指针在数组里的加法

在C语言中,指针与数组经常放在一起使用,很多情况下数组和指针可以互相转换。

 //伪代码   
    int arr[10] = {0,1,2,3,4,5,6,7,8,9};
	int * p = arr;
	arr[i] == * (p+i);//i是大于0小于数组长度-1的任何正整数
	*(arr+1) ==  arr[i];

 数组和指针的不同:

(1)大小不同。

(2)指针可以++,数组名不可以

(3)访问方式不同

数组名在代码中的使用

(1)在定义数组的同一个函数中,sizeof(数组名)表示整个数组的大小

(2)在定义数组的同一个函数中,&数组名+1,表示加上整个数组的大小

(3)其他情况:数组名表示首元素的地址

#include<stdio.h>

int main()
{
    int arr[5] = {1,2,3,4,5};
    int *p1 = (int *)(&arr+1);
    printf("%d\n",p1[-2]);  
    int *p2 = (int *)((int *)&arr+1);              
    printf("%x\n",*p2);                                 
    int *p3 = (int *)((int)&arr+1);
    printf("%x\n",*p3);

    return 0;
}

在本例中,(&arr+1)指向的地址是数组末尾的地址,假设p1的地址是1000,数组大小为20个字节,所以指向的地址为1020。前面加上(int *)是访问地址(1020)的内存空间,打印的p1[-2] ,是将p1指向的地址减去两个int类型的位置,也就是1012(1020-4*2)的位置,再对这个地址进行解引用,打印的是4。

*p2首先是将首地址强转成(int*)的指针类型,然后指针加一,对应的地址是1004(1000+4),这里的4指的是指针的大小,而不是int类型的大小。最后强转成(int*)类型。

*p3是首地址1000强转成int类型,加上一为1001(1000+1),再强转成(int*)类型。指针所占空间为4个字节,所以打印的地址为1001-1005之间的内存空间。按猜想应该打印出来的数字为2,但是在PC机上,使用的是大端储存数据,也就是高地址存储大数据,小地址存储小数据。所以这四个小内存块的顺序是反过来的,打印的值是2000000.。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值