数组与指针

来源:互联网 发布:的士计价器软件 编辑:程序博客网 时间:2024/05/21 14:35

数组是相同变量的有序集合,大小为一片连续的内存空间存储元素。数组名可看作一个常量指针,它指向内存中数组首元素的起始地址。虽然数组的地址&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;}
结果:






原创粉丝点击