-
数组名是数组首个元素的地址
如果buf是一个数组,有以下语句成立:
buf = &buf[0] //数组名是该数组首个元素的地址 -
在c语言中,指针+1表示增加一个存储单元,对于数组而言,地址+1后表示指向下一个元素的地址,这也是为什么声明指针需要有类型的原因之一,只知道地址是不够的,计算机要知道存储对象需要多少字节,也就是指针指向的变量,也要知道变量的类型。
#include <stdio.h>
#include <unistd.h>
#define SIZE 4
int main(int argc, char const *argv[])
{
short a[SIZE];
short *pti; //声明地址需要有类型
pti = a;
// pti = &a[0]; //数组名是数组首个元素的地址
double b[SIZE];
double *ptr; //声明地址需要有类型
ptr = b;
int i;
for(i = 0; i < SIZE; i++)
{
printf("points %d %p %p\n", i, &a[i], &b[i]);
}
return 0;
}
运行结果
从运行结果,可以看出
short 类型的地址是递增2 (因为short在计算机中占用2个字节)
double类型的地址是递增8 (因为double在计算机中占用8个字节)
因此地址+1 表示的是增加一个存储单元,而非字节+1
也就是指针+1,指针的值递增它所指向类型的大小
1)上面列子中,还存在以下对应关系
a + 1 --> &a[1] // a是数组名 也就是数组首个元素地址 地址+1 ==> 指向下一个元素,即 a[1]的地址
*(a + 2) --> a[2]
b + 1 --> &b[1] //b是数组名 也就是数组首个元素地址 地址+1 ==> 指向下一个元素,即 b[1]的地址
*(b + 1) --> b[1]
要时刻铭记:
数组名是数组首个元素的地址
地址+1 表示增加一个存储单元,对应数组 则表示指向下一个元素
2)以下概念不要混淆
*(a + 2) //数组a的第3个元素a[2]
*a + 2 //数组第一个元素的值+2