【C语言初阶】数组名
五、数组名
数组名表示数组首元素的地址。
1 数组名与&数组首元素
int arr[10] = { 0 };
int *p = NULL;
p = arr;
p = &arr[0];
arr
和 &arr[0]
都表示数组首元素的内存地址。二者都是常量,在程序运行过程中不会改变。并且可以把他们赋值给指针变量。
2 数组名示例
2.1 示例1
代码示例:
#include<stdio.h>
int main()
{
//数组名示例1
int arr[10] = { 1,2,3,4,5 };
printf("%p\n", &arr[0]);
printf("%p\n", arr);//同上
printf("%p\n", arr + 0);//同上
printf("%d\n", arr[0]);//1
printf("%d\n", *arr);//1
printf("%d\n", *(arr + 0));//1
return 0;
}
解释说明:
1 我们发现数组名以地址形式打印的结果和数组首元素一致,也就是说数组名的值相当于是首元素的地址。
2 对一维数组数组名进行解引用的结果是一维数组首元素的值。
2.2 示例2
代码示例:
#include<stdio.h>
int main()
{
//数组名示例2
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));//40
printf("%d\n", sizeof arr);//40
return 0;
}
解释说明:
1 sizeof(arr)
:计算的是整个数组的大小。
2 sizeof
后跟变量名或数组名时可以省略括号,如果跟的是类型就必须加上括号。
2.3 示例3
代码示例:
#include<stdio.h>
int main()
{
//对数组名取地址
int arr[10] = { 0 };
printf("arr = %p\n", arr); //00DDF920
printf("arr+1 = %p\n", arr + 1);//00DDF924
printf("&arr[0] = %p\n", &arr[0]); //00DDF920
printf("&arr[0]+1 = %p\n", &arr[0] + 1);//00DDF924
printf("&arr = %p\n", &arr); //00DDF920
printf("&arr+1 = %p\n", &arr + 1); //00DDF948
return 0;
}
解释说明:
1 arr
、 &arr[0]
、 &arr
的值都是一样的。前两个表示数组首元素的地址。而对数组名取地址则表示整个数组的地址。虽然他们的值都是一样的。
2 arr+1
和 &arr[0]+1
都表示跳过一个数组元素类型的大小,即1个 int
。
3 &arr+1
表示跳过一个数组类型的大小,即10个 int
。
4 转换说明 %p
通常以十六进制显示指针的值,而一个 int
(4个字节)用十六进制显示为:0x4
。
2.4 重点说明
-
sizeof(数组名)
:计算的是整个数组的大小。sizeof
的操作数如果是数组名,那么数组名表示的就是整个数组,即计算的是数组这个复合数据类型的大小。 -
&数组名
:取出的是数组的地址。&数组名,数组名表示整个数组。 -
除上述两种情况之外,数组名皆表示数组首元素的地址。
总结:
本节介绍了数组名的含义,以及 sizeof(数组名)
和 &数组名
表示的含义。
感谢您的阅读!如有任何错误,欢迎您的批评指正!