天天看點

【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
*/
           

繼續閱讀