#include <stdio.h>int main(void){int i;int a[5] = {1, 2, 3, 4, 5};int *p = a; // p指向a[0]for(i = 0; i < 5; i++){printf("a[%d] = %d  *(a + %d) = %d | p[%d] = %d  *(p + %d) = %d\n", i, a[i], i, *(a + i), i, p[i], i, *(p + i));}for(i = 0; i < 5; i++){printf("a[%d] = %p  a + %d = %p | &p[%d] = %p  p + %d = %p\n", i, &a[i], i, (a + i), i, &p[i], i, (p + i));}
}

运行结果:

#include <stdio.h>int main(void){int i;int a[5] = {1, 2, 3, 4, 5};int *p = &a[2]; // p指向a[2]for(i = 0; i < 5; i++){printf("a[%d] = %d  *(a + %d) = %d\n", i, a[i], i, *(a + i));}puts("----------------------------------------------------------");for(i = -2; i < 3; i++){printf("p[%d] = %d  *(p + %d) = %d\n", i, p[i], i, *(p + i));}puts("----------------------------------------------------------");puts("----------------------------------------------------------");for(i = 0; i < 5; i++){printf("a[%d] = %p  a + %d = %p \n", i, &a[i], i, (a + i));}puts("----------------------------------------------------------");for(i = -2; i < 3; i++){printf("&p[%d] = %p  p + %d = %p\n",i, &p[i], i, (p + i));}}

运行结果:

数组正确指向数组中的元素

int a[5] = {1, 2, 3, 4, 5};
int *p = a; // p指向a[0]

数组错误指向数组中的元素

int a[5] = {1, 2, 3, 4, 5};
int *p = a[2];  // 无法赋值

因为:a[2]的类型是int,而p的类型是int *,两者不同,不能相互赋值!

在以下两种情况下,数组名不会被视为指向其实元素的指针。

  • 作为 sizeof 运算符的操作数出现时
    sizeof(数组名)不会生成指向起始元素的指针的长度,而是生成数组整体的长度。
  • 作为取址运算符 & 的操作数出现时
    & 数组名不是指向起始元素的指针的指针,而是指向数组整体的指针。

如果在指向数组内元素的指针p + i 前写上指针运算符 *,会变成什么情况呢?
因为 p + i 是指向 p 所指元素后第 i 个元素的指针,所以在其前加上指针运算符后得到的 *(p + i)就是该元素的别名。因此,如果p指向a[0],那么表达式 *(p + i)就表示a[i]本身。

总结:

  • 指针 p 指向数组中的元素e时,
    指向元素 e 后第 i 个元素的 *(p + i),可以写为p[ i ]。
    指向元素 e 前第 i 个元素的 *(p - i),可以写为p[-i]。
  • 数组a的元素个数为n时,构成数组a的元素是a[0]到a[n-1],共“n个”。但是,指向数组元素的指针,则可以是&a[0]到&a[n],共“n + 1”个。之所以会出现这种情况,是因为在对遍历数组元素的结束条件(是否达到了末尾)进行判定时,如果可以利用指向末尾元素后一个元素的指针的话将会非常方便。
  • Type* 型指针 p 指向 Type型数组 a 的起始元素a[0]时,指针 p 的行为就和数组 a 本身一样。
  • 数组的下标表示位于起始元素后的第几个元素的位置,因此必须从0开始。

注意:

  • 虽然可以为指针加上整数,但是指针之间相减是不可以的。
  • 指针之间做减法是可以的。

数组正确的赋值示例

int *p
int x[5];
p = x; // 正确的赋值

数组错误的赋值示例

int a[3]
int b[3];
a = b;  // 错误的赋值

赋值表达式的左操作数不可以是数组名。
准确来说是 不可使用赋值运算符改变指向数组起始元素的指针。

C语言 显示数组元素的值和地址相关推荐

  1. 动态二维数组外圈元素值的和_C语言 | 用指向元素的指针变量输出二维数组元素的值...

    例33:有一个3*4的二维数组,要求用C语言实现指向元素的指针变量输出二维数组个元素的值. 解题思路:二维数组的元素时整型的,它相当于整型变量,可以用int*型指针变量指向它.二维数组的元素在内存中是 ...

  2. 790-C语言的数组元素下标为何从0开始?

    C语言的数组元素下标为何从0开始? 我们在学习数组时会有这个疑问,数组元素的下标为什么不从1开始呢? 从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个. 的确,有些计算机语言如 ...

  3. java数组下标0_Java语言中数组元素下标从0开始。

    [单选题]规范规定,硅酸盐水泥的初凝时间不小于( ). [判断题]打开/关闭"对象追踪"的功能键是F11. [判断题]break语句的作用是结束当前的循环体. [单选题]项目标识代 ...

  4. 删除数组中指定元素_如何删除PHP数组元素键值并重新排序

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 想要删除PHP数组中某个元素键值,然后重新规范索引排序.我们可以使用PHP中的内置函数uns ...

  5. C语言将数组中的值逆序存放

    C语言将数组中的值逆序存放 #include<stdio.h> #define N 5 int main(){int a[N], i, temp;printf("请输入一个数组: ...

  6. c语言打印数组元素_C程序打印元素差为0或1的子集数

    c语言打印数组元素 Given an array of integers, find and print the maximum number of integers you can select f ...

  7. php 未定义数组索引_如何删除PHP数组元素键值并重新排序

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 想要删除PHP数组中某个元素键值,然后重新规范索引排序.我们可以使用PHP中的内置函数uns ...

  8. c语言中的下标变量是什么,c语言引用数组元素时其数组下标的允许的数据类型是什么...

    c语言引用数组元素时其数组下标的允许的数据类型是什么 发布时间:2020-07-30 11:56:52 来源:亿速云 阅读:621 作者:Leah c语言引用数组元素时其数组下标的允许的数据类型是什么 ...

  9. java如何打印数组的值,Java打印数组元素的值

    本篇文章帮大家学习java打印数组元素的值,包含了Java打印数组元素的值使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 以下实例演示了如何通过重载 MainClass ...

最新文章

  1. jdk安装教程_在JDK 12精简数字格式中使用最小分数数字
  2. python实现真正的冒泡排序算法(时间复杂度优化版)!
  3. ribbon和feign的区别
  4. python写机器人程序_用Python写的一个多线程机器人聊天程序
  5. c json输出html标签,Json编码HTML字符串
  6. Simulink之绝缘栅双极型晶体管(IGBT)
  7. 冷知识 —— 容易读错的发音(英文)
  8. Spring Boot的MyBatis注解:@MapperScan和@Mapper
  9. 黑域助手连接服务器才能用吗,黑域app怎么使用?进入黑域详细教程[图]
  10. iphone4s蜂窝数据连不上解决方案
  11. Linux命令老是记不住?一篇文章帮你解决。Linux常用命令汇总
  12. 玩转Atlas 200DK(一)分设环境之开发环境准备
  13. 龙芯IPC追平Zen2 稳步推进产业生态
  14. C/C++的内存分配?栈和堆的区别?为什么栈快?
  15. hbase学习教程(一):hbase的概述和hbase架构及基本组件
  16. python游戏开发框架_Python游戏开发:数字华容道
  17. Nature重磅!在机器人骨架上首次生成人类肌腱细胞
  18. Silverlight认识
  19. 阅读nutch.Analysis.jj
  20. 强制卸载VS2013

热门文章

  1. 《Adobe Illustrator CS6中文版经典教程(彩色版)》—第1课1.8节使用面板菜单
  2. 【BZOJ2738】矩阵乘法 [整体二分][树状数组]
  3. 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数
  4. String to Integer (atoi) leetcode java
  5. 备份集中的数据库备份与现有的 '***' 数据库不同 RESTORE DATABASEnbs
  6. RHEL6入门系列之十三,阶段练习1
  7. C# 时间+三位随机数
  8. CodeBlcoks插件
  9. Windows7中Prefetch预读文件技术详解
  10. 为什么一定要回家?因为我们是中国人