数组名代表数组的首地址,例如:
int a[10]; int *p=NULL; p=a;
       其中,数组名a代表数组的首地址(即&a[0]),那么表达式a+i代表数组中下标为i元素a[i]的地址,即&a[i]。
       还可以通过使用间接寻址*来引用数组元素。例如:*(a+i)表示取出首地址元素后边第i个元素的内容,即下标为i的元素a[i]。
        此外,还可以通过一维数组的指针变量p来引用数组a中的元素,*(p+i)就表示取出p+i所指的内存单元内容,即元素a[i]的值。*(p+i)
也可以用它的下表形式p[i]来表示。

例如:
# include <stdio.h> int main(void) { int a[] = {1, 2, 3, 4, 5}; int *p, *q,
*r; p = &a[3]; //第一种写法 printf("*p = %d\n", *p); q = a; //第二种写法 q = q + 3;
printf("*q = %d\n", *q); r = a; //第三种写法 printf("*(r+3) = %d\n", *(r+3)); return
0; }
输出结果是:
*p = 4
*q = 4
*(r+3) = 4
注意:(1)与通过*(a+i)来引用数组元素a[i]不同的是由于指针变量p不一定永远都指向数组元素的首地址&a[0],因此仅当指针变量p指向数组元素首地址
&a[0]时,*(p+i)才是对a[i]的引用,否则,如果通过增1运算改变指针变量p的指向,使p指向a[i],那么*)就是对a[i]的引用。
(2)数组名a是一个地址常量,不能通过赋值操作改变它的值。指针变量p是一个变量,可以通过赋值运算改变它的值,从而使p指向数组中的其他元素。
(3)虽然p+1和p++都指向当前指针所指向单元的下一个元素但是p+1不改变当前指针的指向,而p++相当于执行p=p+1,因此p++操作改变了指针p
的指向,表示指针变量p向前移动使其指向下一个元素。
(4)p+1增加1*sizeof(指针的基类型)。
例如:
# include <stdio.h> int main(void) { int a[] = {1, 2, 3, 4, 5}; int *p = a;
printf("p = %d, p + 1 = %d\n", p, p+1); return 0; }
输出结果是:
p = 1638196, p + 1 = 1638200

参考文献:C语言大学实用教程

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信