C语言数组名与指针区别

C语言数组名与指针区别教程

C 语言 中,数组名指针 之间,经常会交替使用这两个 变量,比如,把一个指针当成数组来使用,或者是把数组名赋值给指针,通过指针来访问数组成员变量。

但是,数组名与指针很多场景是可以通用,但它们还是有区别的,数组名不等于指针。

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; }

程序运行后,控制台输出如下图所示:

21_C语言数组名与指针区别.png

我们可以看到,我们分别获取了数组名的地址,数组的第一个元素的地址和数组名,结果发现它们的值是相等的,也就是说,数组名其实就是一个指向了数组第一个元素的一个指针。

因此,我们可以得出结论对数组名取地址得到的是数组名所指元素的地址,而对指针取地址得到的是指针变量自身的地址。

数组名是常量指针,指针是变量指针

数组名是常量指针,不可以被修改,指针是变量指针,可以修改

#include <stdio.h> int main() { printf("嗨客网(www.haicoder.net)\n\n"); int arr[] = {1, 3, 5}; printf("arr = %d", arr++); return 0; }

程序运行后,控制台输出如下图所示:

22_C语言数组名与指针区别.png

我们可以看到,我们试图对数组名进行 自增 操作,但结果程序报错了,因为,数组名是一个常量指针,不可以被修改,现在,我们定义一个指针,修改程序如下:

#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; }

程序运行后,控制台输出如下图所示:

23_C语言数组名与指针区别.png

这次,我们定义了一个指针,指向了数组,这次,我们再次移动指针,发现,指针时可以移动的,因此,数组名是常量指针,不可以被修改,指针是变量指针,可以修改。

数组名与指针sizeof区别

数组名与指针 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; }

程序运行后,控制台输出如下图所示:

24_C语言数组名与指针区别.png

我们可以看到,当对数组名使用 sizeof 时,得到的是数组元素的个数乘元素类型的字节数,对指针 sizeof 得到的是指针类型的字节数。

C语言数组名与指针区别教程总结

数组名取地址得到的是数组名所指元素的地址,而对指针取地址得到的是指针变量自身的地址。数组名是常量指针,而指针是变量指针。

当对数组名使用 sizeof 时,得到的是数组元素的个数乘元素类型的字节数,而对指针 sizeof 得到的是指针类型的字节数。