C语言中的指针-指针数组-学习笔记-39

什么是指针数组?

一个数组,若其元素均为指针类型数据,称为指针数组
也就是说,每一个数组元素,都存放的是一个地址,每个元素也相当于一个指针变量。

定义一个指针数组

int * p[4]

因为 [ ] 的优先级比*高,所以,p 先跟[ ] 结合为一个数组,然后数组再跟* 结合,表示这个数组是一个指针类型的。即这个数组的每个元素都相当于一个指针,可以指向一个整型变量

凡事没有加括号,在前面加*号的,一般都表示这是一个指针型的 XXX。例如:

1
2
3
int *p;  // 表示一个指针
int *p (int , int); // 表示一个指针函数
int *p [5]; //表示的是一个元素为指针的数组

不要写成

1
int (*p)[5];  //这是指向一维数组的指针变量

定义以为指针数组的一般形式是:

类型名 * 数组名 [ 数组长度 ]

前面的类型名表示,数组元素中,指针指向的数据的类型。

使用指针数组

学习了如何定义指针数组,那么什么时候来使用指针数组呢?

指针数组比较适合用来指向若干字符串

这样字符串的处理就可以更加的灵活。

图书管理的例子

图书馆有很多书
每种书的书名长度不一样
书名是一个字符串,存储用的是字符数组
10本书就是10个字符数组,也就是一个二维数组
但是每本书的书名不一样长如《蛙》《C 语言程序设计》
如果有10本书,最长的书名有20个字符,那就是 book[10][20]
但这样就太浪费内存空间了,咋办?
指针数组的优势就来了!
指针数组中的元素,存储书名这个字符数组的首元素地址

book_name[0]=&name[]=”蛙”
book_name[1]=&name[]=”C 语言程序设计”

这样,作为名字的字符串,还是占用名字长度的内存空间,但是对于存储这些地址的指针数组来说,就可以灵活的调用不同长度的字符串了。

举个例子

对于指针数组中的4本数,使用strcmp 函数对齐从小到大排序,并输出排序结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <string.h>
int main(){
void book_sort( char *book[],int n);
void print_book(char *book[],int n);
char *book_name[]={"Book_a","Book_b","Book_c","book_d"};
int n=4;
book_sort(book_name,n);
print_book(book_name,n);
return 0;
}

void book_sort(char *book[],int n){
char *cache;
for (int i=0;i<n;i++){
for (int j=0;j<4;j++){
if(strcmp(book[i],book[j])<0){
cache = book[i];
book[i]=book[j];
book[j]=cache;
}
}
}
}

void print_book(char *book[],int n){
for (int i=0;i<n;i++){
printf("%s\n",book[i]);
}
}

指针数组赋值

从上面的例子我们看到,指针数组赋值的方式有些不同:

1
2
3
4
5
6
char *book_name[]={"Book_a","Book_b","Book_c","Book_d"};
//上面是指向字符的指针数组的赋值
char book_name[]="Book_a";
//上面是字符数组的赋值
int book_num[]={1,2,3,4};
//这是普通数组的赋值

我们知道,普通数组的赋值是花括号,然后跟着每个元素的值,但是作为指针数组,它的每个元素都是指针也就是地址,所以我们直接将字符串作为它的元素指针数组会保存该字符串的首元素地址

指针数组的使用

1
2
3
4
5
6
char *book_name[]={"Book_a","Book_b","Book_c","Book_d"};
//上面是指向字符的指针数组的赋值
book_name[1];
//作为普通数组使用的时候,输出的是 book_b 的首元素地址
*book_name[1];
//作为指针数组使用的时候,输出的是该地址指向的值,也就是 B

在使用数组的时候,和普通数组无异,但是,因为数组元素存储的是指针,所以我们在数组元素前加*号,就可以显示该地址指向的值。

为什么形参能改变实参?

这里形参接收到的是数组的起始地址,由于我们直接操作的是内存地址,所以代表着我们直接改变的就是实参的值。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!