数组与指针

数组是相同变量的有序集合,大小为一片连续的内存空间存储元素。数组名可看作一个常量指针,它指向内存中数组首元素的起始地址。虽然数组的地址&a与数组名的值相同,可是表示不同的概念,数组的大小sizeof(*a)*array_size ==sizeof(*a)*(sizeof(a)/sizeof(*a))

因此*(a+i)相当于a[i],

指针是一种特殊类型的变量,存放指向数据变量的地址。其实本质上还是变量,既然是变量就占一定的内存空间,而它的内存空间,好像与地址总线有关。目前的指针大小都占四个字节,以后CPU的发展与操作系统的升级,可能会占更大的内存空间。

指针运算

p + n;  ==    (unsigned int)p + n*sizeof(*p);
当指针p指向一个同类型的数组的元素时: p+1将指向当前元素的下一个元素; p-1将指向当前元素的上一个元素。

指针之间只支持减法运算,且必须参与运算的指针类型必须相同
p1 – p2; ( (unsigned int)p1 - (unsigned int)p2) / sizeof(type);
注意:
只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差
当两个指针指向的元素不在同一个数组中时,结果未定义
,可能没有实际意义,主要是两个数组分配的内存空间方式可能不同
#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);
    //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;
}
结果:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值