C语言之数组篇为什么数组名不能自增和自减而指针却可以

Posted 菜鸟弟弟啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言之数组篇为什么数组名不能自增和自减而指针却可以相关的知识,希望对你有一定的参考价值。

首先,要理解这个问题,需要对数组和指针有一定的了解,下面一起来回顾一下

数组的定义

要先定义后使用
格式:类型名称 数组名[常量表达式(可选)]

int arr[];//数组长度不确定 
int arr1[4];//数组长度为4

数组的初始化

数组初始化元素的值默认为0,没有初始化数组的元素值为随机数

  1. 初始化数组
# include <stdio.h>
int main(void)
{
	int a[4]={1,2,3};
	printf("%d\\n",a[3]);//初始化数组值为0
	return 0;
}
/*
0
Press any key to continue
*/
  1. 无初始化数组
# include <stdio.h>
int main(void)
{
	int a[4];
	printf("%d\\n",a[3]);//没有初始化元素值为系统随机数
	return 0;
}
/*
-858993460
Press any key to continue
*/

接下来聊聊赋值运算符、变量和常量

赋值运算符的定义:将一个表达式的值赋给一个左值,其中左值必须能够被修改,不能是常量!!!换句话说,赋值运算符的左值必须是变量

数组的使用

数组名代表第一个元素的首地址,是一个具体的常量,假如让数组名自增或自减,在其过程中必涉及到赋值的运算,而一个地址常量是不能作为赋值运算符的左值的,所以,编译就会报错

# include <stdio.h>
int main(void)
{
	int a[4];
	a++;//程序运行到这里就会报错
	printf("%d\\n",a[3]);
	return 0;
}
/*
 error C2105: '++' needs l-value
*/

指针是用来存放地址的变量,而变量是可以作为赋值运算符的左值,所以指针是可以进行自增和自减的,但是要注意的是指针变量有两种表达方式,其产生的效果是完全不一样的

  • 第一种表达:指针变量操作地址进行自增或自减
# include <stdio.h>
int main(void)
{
	int arr[4]={1,2,3,4};
	int *p = arr;
	printf("%d,%d\\n",p,*p);
	printf("%d\\n",*p++);//按结合性,从右往左进行运算
	printf("%d,%d\\n",p,*p);
	return 0;
}
/*
1703712,1
1
1703716,2
Press any key to continue
*/
  • 第二种表达:指针变量操作值进行自增或自减
# include <stdio.h>
int main(void)
{
	int arr[4]={1,3,5,7};
	int *p = arr;
	printf("%d,%d\\n",p,*p);
	printf("%d\\n",(*p)++);
	printf("%d,%d\\n",p,*p);//p地址始终没有改变
	return 0;
}
/*
1703712,1
1
1703712,2
Press any key to continue
*/

以上是关于C语言之数组篇为什么数组名不能自增和自减而指针却可以的主要内容,如果未能解决你的问题,请参考以下文章

C语言之数组篇为什么数组名不能自增和自减而指针却可以

C语言后置自增啥时候自增(自减)?

JavaScript自增和自减

Java自增和自减操作符——++/--的那些事

JS基础_自增和自减

byte数组会自增吗?