什么是指针数组?
一个数组,若其元素均为指针
类型数据,称为指针数组
。
也就是说,每一个数组元素,都存放的是一个地址,每个元素也相当于一个指针变量。
定义一个指针数组
int * p[4]
因为 [ ]
的优先级比*
高,所以,p 先跟[ ] 结合为一个数组
,然后数组再跟* 结合,表示这个数组是一个指针类型的
。即这个数组的每个元素都相当于一个指针,可以指向一个整型变量
。
凡事没有加括号,在前面加*
号的,一般都表示这是一个指针型的 XXX。例如:
1 | int *p; // 表示一个指针 |
不要写成
1 | int (*p)[5]; //这是指向一维数组的指针变量 |
定义以为指针数组的一般形式是:
类型名 * 数组名 [ 数组长度 ]
前面的类型名表示,数组元素中,指针指向的数据的类型。
使用指针数组
学习了如何定义指针数组,那么什么时候来使用指针数组呢?
指针数组比较适合用来指向若干字符串
这样字符串的处理就可以更加的灵活。
图书管理的例子
图书馆有很多书
每种书的书名长度不一样
书名是一个字符串,存储用的是字符数组
10本书就是10个字符数组,也就是一个二维数组
但是每本书的书名不一样长如《蛙》《C 语言程序设计》
如果有10本书,最长的书名有20个字符,那就是 book[10][20]
但这样就太浪费内存空间了,咋办?
指针数组的优势就来了!
指针数组中的元素,存储书名这个字符数组的首元素地址
book_name[0]=&name[]=”蛙”
book_name[1]=&name[]=”C 语言程序设计”
这样,作为名字的字符串,还是占用名字长度的内存空间,但是对于存储这些地址的指针数组来说,就可以灵活的调用不同长度的字符串了。
举个例子
对于指针数组中的4本数,使用strcmp
函数对齐从小到大排序,并输出排序结果。
1 |
|
指针数组赋值
从上面的例子我们看到,指针数组赋值的方式有些不同:
1 | char *book_name[]={"Book_a","Book_b","Book_c","Book_d"}; |
我们知道,普通数组的赋值是花括号,然后跟着每个元素的值,但是作为指针数组,它的每个元素都是指针也就是地址,所以我们直接将字符串作为它的元素
,指针数组会保存该字符串的首元素地址
。
指针数组的使用
1 | char *book_name[]={"Book_a","Book_b","Book_c","Book_d"}; |
在使用数组的时候,和普通数组无异,但是,因为数组元素存储的是指针,所以我们在数组元素前加*号,就可以显示该地址指向的值。
为什么形参能改变实参?
这里形参接收到的是数组的起始地址,由于我们直接操作的是内存地址,所以代表着我们直接改变的就是实参的值。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。