在 C 语言 中,数组名 和 指针 之间,经常会交替使用这两个 变量,比如,把一个指针当成数组来使用,或者是把数组名赋值给指针,通过指针来访问数组成员变量。
但是,数组名与指针很多场景是可以通用,但它们还是有区别的,数组名不等于指针。
对比 | 数组名 | 指针 |
---|---|---|
取地址 | 数组名取地址得到的是数组名所指元素的地址 | 对指针取地址得到的是指针变量自身的地址 |
常量变量 | 数组名是常量指针 | 指针是变量指针 |
sizeof | 当对数组名使用 sizeof 时,得到的是数组元素的个数乘元素类型的字节数 | 对指针 sizeof 得到的是指针类型的字节数 |
数组名取地址得到的是数组名所指元素的地址,指针取地址得到的是指针变量自身的地址
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int arr[] = {1, 3, 5};
printf("&arr = %d\n", &arr);
printf("&arr[0] = %d\n", &arr[0]);
printf("arr = %d\n", arr);
return 0;
}
程序运行后,控制台输出如下图所示:
我们可以看到,我们分别获取了数组名的地址,数组的第一个元素的地址和数组名,结果发现它们的值是相等的,也就是说,数组名其实就是一个指向了数组第一个元素的一个指针。
因此,我们可以得出结论对数组名取地址得到的是数组名所指元素的地址,而对指针取地址得到的是指针变量自身的地址。
数组名是常量指针,不可以被修改,指针是变量指针,可以修改
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int arr[] = {1, 3, 5};
printf("arr = %d", arr++);
return 0;
}
程序运行后,控制台输出如下图所示:
我们可以看到,我们试图对数组名进行 自增 操作,但结果程序报错了,因为,数组名是一个常量指针,不可以被修改,现在,我们定义一个指针,修改程序如下:
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int arr[] = {1, 3, 5};
int *pArr = arr;
printf("pArr = %d", *pArr++);
return 0;
}
程序运行后,控制台输出如下图所示:
这次,我们定义了一个指针,指向了数组,这次,我们再次移动指针,发现,指针时可以移动的,因此,数组名是常量指针,不可以被修改,指针是变量指针,可以修改。
数组名与指针 sizeof 区别
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int arr[] = {1, 3, 5};
int *pArr = arr;
int arrSize = sizeof(arr);
int pArrSize = sizeof(pArr);
printf("arrSize = %d, pArrSize = %d\n", arrSize, pArrSize);
return 0;
}
程序运行后,控制台输出如下图所示:
我们可以看到,当对数组名使用 sizeof 时,得到的是数组元素的个数乘元素类型的字节数,对指针 sizeof 得到的是指针类型的字节数。
数组名取地址得到的是数组名所指元素的地址,而对指针取地址得到的是指针变量自身的地址。数组名是常量指针,而指针是变量指针。
当对数组名使用 sizeof 时,得到的是数组元素的个数乘元素类型的字节数,而对指针 sizeof 得到的是指针类型的字节数。