c语言指针数组与数组指针:别再搞混了,一篇讲清区别

admin C语言 4


刚学 C 语言的朋友,是不是看到 “指针数组” 和 “数组指针” 这俩词就头大?名字就差俩字,长得也挺像,到底有啥不一样啊?有时候看书上的例子,越看越迷糊,写代码的时候更是乱用,结果程序要么报错要么跑不对。其实啊,这俩东西虽然名字像,但根本不是一回事。今天兔子哥就用大白话给你掰扯掰扯,保证新手也能看明白,一起往下看吧!

先搞懂指针数组:它本质是数组,装的是指针


指针数组,听名字就知道,它首先是个数组,只不过这个数组里装的不是普通的数字、字符,全是指针。就像一个盒子,里面放的全是地址卡片,每张卡片都能找到别的东西。
怎么定义一个指针数组呢?比如:
int *arr [3];
这里的 arr 就是一个指针数组。为啥这么说?因为 [] 的优先级比 * 高,所以 arr 先和 [3] 结合,说明它是一个有 3 个元素的数组;剩下的 int * 说明数组里的每个元素都是 int 类型的指针。
举个例子,咱们可以让这三个指针分别指向三个整数:
int a = 1, b = 2, c = 3;
int *arr [3] = {&a, &b, &c};
这时候,arr [0] 就是指向 a 的指针,*arr [0] 就是 1;arr [1] 是指向 b 的指针,*arr [1] 就是 2,以此类推。你看,指针数组的核心是 “数组”,只不过元素类型特殊,是指针而已。
那指针数组有啥用呢?最常见的是处理字符串,比如定义一个存放多个字符串的数组,用指针数组就很方便:
char *strs [3] = {"apple", "banana", "cherry"};
这样每个元素都是指向字符串的指针,比用二维字符数组省内存多了。


再看数组指针:它本质是指针,指向的是数组


数组指针呢,刚好反过来,它首先是个指针,这个指针专门指向一个数组。就像一个地址卡片,上面写的门牌号对应的不是单个房间,而是一整栋楼。
定义数组指针的写法是这样的:
int (*p)[3];
这里的 p 就是一个数组指针。因为有括号,* 和 p 先结合,说明 p 是个指针;后面的 [3] 和 int 说明这个指针指向的是一个有 3 个 int 元素的数组。
怎么用呢?比如有个数组 int arr [3] = {1,2,3}; 让 p 指向它:
int (*p)[3] = &arr
这时候 p 就指向了整个 arr 数组。那怎么通过 p 访问数组里的元素呢?可以这么写:(*p)[0] 就是 1,(p)[1] 就是 2。这里的p 就相当于数组名 arr,所以 (*p)[i] 和 arr [i] 是一样的。
数组指针的核心是 “指针”,它的使命就是指向一个特定大小的数组。那它啥时候用呢?比如函数参数需要传递二维数组的时候,用数组指针就很方便,能明确告诉函数传递的数组有多少列。


用表格对比一下,区别一目了然


可能你还是有点晕,咱们用个表格把两者的区别列出来,一看就明白:
类型定义写法本质访问元素方式主要用途
指针数组int *arr[3];数组*arr[i]存放多个同类型指针,如字符串数组
数组指针int (*p)[3];指针(*p)[i]指向特定大小的数组,如传递二维数组

看出来了吧,最关键的就是定义时的括号,有没有括号直接决定了它是数组还是指针。这括号就像个 “优先级开关”,加了括号,指针的身份就先确定了;不加括号,数组的身份先确定。


新手常犯的错,你可别踩坑


刚开始学的时候,很容易把这俩搞混,兔子哥总结了几个常见错误,你可得注意:
  • 定义的时候漏写括号,把数组指针写成 int *p [3]; 结果变成了指针数组,完全不是一回事。
  • 访问数组指针元素时忘了加 *,直接写 p [i],这时候 p 是指向数组的指针,p [i] 就跑偏了,应该写成 (*p)[i]。
  • 以为指针数组和数组指针可以随便换着用,其实它们的内存布局和用法都不一样,乱用肯定出问题。

你可能会问,怎么才能记住哪个是哪个啊?兔子哥有个笨办法:看名字,前面的词是核心。“指针数组”,核心是数组;“数组指针”,核心是指针。就像 “水果篮” 是篮子装水果,“篮球架” 是架子打篮球,这么一想是不是好记多了?


其实啊,刚开始分不清真的很正常,兔子哥当年学的时候也迷糊了好几天。后来拿着代码一遍遍试,看它们的大小(用 sizeof),看它们怎么访问元素,慢慢就摸清楚规律了。
我的个人经验是,别死记硬背,多动手写代码。比如定义一个指针数组,再定义一个数组指针,分别打印它们的大小,试着访问里面的元素,对比一下结果,你会发现它们的区别其实很明显。
最后想说,这俩东西虽然绕,但只要搞懂了本质,用起来会很顺手。指针数组适合当 “容器” 装多个指针,数组指针适合 “定位” 到一个数组,各有各的用处。慢慢练,你肯定能分清它们!

标签: 一个盒子 以此类推

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~