C语言:数组的地址和数组首元素的地址的区别

数组的地址和数组首元素的地址在编译器上可能输出相同的地址

int main() {
	int arr[] = { 1 };
	printf("%p\n", &arr);
	printf("%p\n", arr);
	return 0;
}

C语言:数组的地址和数组首元素的地址的区别_第1张图片
C和C++等语言中,数组是一种复合数据类型,可以存储相同类型的多个元素。当我们谈论数组的地址时,我们通常指的是整个数组的起始地址,也就是数组第一个元素的地址。但这并不意味着数组的地址和数组首元素的地址是完全相同的,尽管它们在数值上可能相同。

以下是它们之间的主要区别:

1.类型不同:

数组的地址:它是指向整个数组的指针,其类型是数组类型(例如,int (*p)[10]表示一个指向含有10个整数的数组的指针)。
数组首元素的地址:它是指向数组第一个元素的指针,其类型是该元素的类型(例如,int *p表示一个指向整数的指针)。

2.解引用行为:

当你解引用数组的地址时,你会得到一个数组。例如,如果你有一个指向10个整数的数组的指针int (*p)[10],*p将得到一个包含10个整数的数组。
当你解引用数组首元素的地址时,你会得到数组的第一个元素。例如,如果你有一个指向整数的指针int *p,*p将得到一个整数。

3.指针算术:

当你对数组的地址进行指针算术运算时,你会跳过整个数组。例如,p+1会使p前进到下一个同类型数组的位置。
当你对数组首元素的地址进行指针算术运算时,你会逐个元素地前进。例如,p+1会使p前进到数组中的下一个整数位置。

尽管数组的地址和数组首元素的地址在数值上可能相同(在大多数现代系统上),但它们在类型和行为上是不同的。

你可能感兴趣的:(C语言模糊知识点,c语言,java,数据结构,游戏,开发语言,算法)