专栏首页嵌入式大杂烩【C语言笔记】数组与指针不等价

【C语言笔记】数组与指针不等价

前言

数组与指针是不等价的,如:

  • 数组名不可以改变,而指向数组的指针是可以改变的。
  • 字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。
  • 求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度。

区别一

数组名的指向不可以改变,而指向数组的指针是可以改变的。

请看如下代码:

#include <stdio.h>

int main(void)
{
 int a[5] = {0, 1, 2, 3, 4}, *p = a;
 char i;

 // 数组遍历方式一
 for ( i = 0; i < 5; i++ )
 {
   printf("a[%d] = %d\n", i, *p++);
 }

 // 数组遍历方式二
 for ( i = 0; i < 5; i++ )
 {
   printf("a[%d] = %d\n", i, *a++);
 }

 return 0;
}

数组遍历方式一:使用指针遍历数组元素,p++等价于(p++),即指针指向的地址每次后移一个单位,然后再取地址上的值。这里的一个单位是sizeof(int)个字节。

数组遍历方式二:使用数组名自增遍历数组元素,编译出错,错误如下:

error: value required as increment operand

因为数组名的指向是不可以改变的,使用自增运算符自增就会改变其指向,这是不对的,数组名只能指向数组的开头。但是可以改为如下遍历方式:

for ( i = 0; i < 5; i++ )
 {
   printf("a[%d] = %d\n", i, *(a+i));
 }

这可以正确遍历数组元素。因为*(a+i)与a[i]是等价的。

区别二

字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。

请看如下代码:

//字符串定义方式一
char str[] = "happy";

//字符串定义方式二
char *str = "happy";

字符串定义方式一:字符串中的字符是可以改变的。如可以使用类似str[3]=’q’这样的语句来改变其中的字符。原因就是:这种方式定义的字符串保存在全局数据区或栈区,是可读写的。

字符串定义方式二:字符串中的字符是不可以改变的。原因就是:这种方式定义的字符串保存在常量区,是不可修改的。

区别三

求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度。

请看如下代码:

#include <stdio.h>

int main(void)
{
 int a[] = {0, 1, 2, 3, 4}, *p = a;
 char len = 0;

 // 求数组长度方式一
 printf("方式一:len=%d\n",sizeof(a)/sizeof(int));

 // 求数组长度方式二
 printf("方式二:len=%d\n",sizeof(p)/sizeof(int));

 return 0;
}

运行结果

方式一:len=5
方式二:len=1

求数组长度方式一:借用数组名来求数组长度,可求得数组有5个元素,正确。

求数组长度方式二:借用指针求数组长度,求得长度为1,错误。原因是:

p只是一个指向int类型的指针,编译器不知道其指向的是一个整数还是指向一个数组。sizeof(p)求得的是p这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

以上就是指针与其指向的数组的三个典型的区别:(1)遍历数组时需要注意;(2)修改字符串中的字符时需要注意;(3)求数组长度时需要注意。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【C语言笔记】关于数组与指针的总结

    如果一个指针p指向一个数组arr[]的开头,那么p+i为数组第i个元素的地址,即&arr[i],那么*(p+i)为数组第i个元素的值,即arr[i]。

    正念君
  • C编程练习003

    正念君
  • JSON的简单认识

    JSON(JavaScript Object Notation):JavaScript 对象表示法。其是一种轻量级的数据交换格式,简洁和清晰的层次结构使得其成为...

    正念君
  • C++小议二维数组

    一、二维数组的介绍 当数组元素具有两个下标时, 该数组称为二维数组。 二维谁可以看做具有行和列的平面数据结构。 二、二维数组的定义 定义二维数组的形式:

    老九学堂-小师弟
  • Java 多维数组遍历

    数组是Java中的一种容器对象,它拥有多个单一类型的值。当数组被创建的时候数组长度就已经确定了。在创建之后,其长度是固定的。下面是一个长度为10的数组:

    哲洛不闹
  • 13 个 JS 数组精简技巧,一起来看看。

    数组是 JS 最常见的一种数据结构,咱们在开发中也经常用到,在这篇文章中,提供一些小技巧,帮助咱们提高开发效率。

    前端小智@大迁世界
  • 数组是如何随机访问元素?数组下标为什么从0开始,而不是1?

    数组(Array)是一种线性表数据结构,它用一组连续的内存空间,来存储相同类型的数据。

    搜云库技术团队
  • 探究JS V8引擎下的“数组”底层实现

    JavaScript 中的数组有很多特性:存放不同类型元素、数组长度可变等等,这与数据结构中定义的数组结构或者C++、Java等语言中的数组不太一样,那么JS数...

    2020labs小助手
  • Python科学计算 | NumPy——快速处理数据01

    最近在看张若愚老师的《Python科学计算》,也算是对Python的基本功进行一次锻炼,看着就记下笔记,这里开个系列来分享一下个人笔记,文章内容都是markdo...

    Sam Gor
  • Java数组

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。

    用户5224393

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动