C语言之数组指针和指针数组
- 一、含义
- 二、定义
- 2.1 指针数组
- 2.2 数组指针
- 三、使用
- 3.1 指针数组在参数传递时的使用
- 3.1.1 指针数组的排序
- 3.2 数组指针在参数传递时的使用
一、含义
-
指针数组:顾名思义,其为一个数组,数组里面存放着多个指针,指针的类型可选。
-
数组指针:数组指针实质上就是一个指针,用”数组”修饰这个指针,意思是说这个指针存放着一个数组的首地址,或者说这个指针指向一个数组的首地址。
明白了吧,小伙子们。
二、定义
2.1 指针数组
char* (char_array[3]) = {"hello", "world", "GGBod"}; //拥有3个元素的数组,每个元素是一个char类型的指针,总大小为 3*4=12 个字节
int* (int_array[4]) = {1, 2, 3, 4};
struct Student* (struct_array[2]) = {{xxx} ,{xxx}};
上述括号可去掉,这里只是方便大家理解。
2.2 数组指针
char (*char_point)[3]; //这里的括号便不可去掉,用于指明这是一个指针
这里是一个指向一个拥有三个char类型元素的数组的指针,它指向数组的首地址,当执行 char_point++ 时,char_point会加3。
三、使用
3.1 指针数组在参数传递时的使用
- 指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,另一个指针数组用来接收每个参数(字符串)的地址。
int main(int argc, char *argv[])
此时可以想象内存映像图,主函数的栈区有一个叫argv的数组,这个数组的元素是你输入的参数的地址,指向着只读数据区。
- 如果是向子函数传参,这和传递一个普通数组的思想一样,不能传递整个数组过去,如果数组很大,这样内存利用率很低,所以应该传递数组的首地址,用一个指针接收这个地址。因此,指针数组对应着二级指针。
void fun(char **pp); //子函数中的形参
fun(char *p[]); //主函数中的实参
3.1.1 指针数组的排序
#include "stdio.h"
#include "string.h"
void sort(char **pa, int n) // 冒泡排序
{int i, j;char *tmp = NULL;for (i = 0; i < n - 1; i++){for (j = 0; j < n - 1 - i; j++){if ((strcmp(*(pa + j), *(pa + j + 1))) > 0){tmp = *(pa + j);*(pa + j) = *(pa + j + 1);*(pa + j + 1) = tmp;}}}
}int main(void)
{char *pa[4] = {"abc", "xyz", "opq", "jiok"};sort(pa, 4);for (int i = 0; i < 4; i++){printf("%s\n", pa[i]);}return 0;
}
3.2 数组指针在参数传递时的使用
void fun(int (*P)[4]);//子函数中的形参,指针数组 a[3][4] = {0};//主函数中定义的二维数组
fun(a);//主函数调用子函数的实参,是二维数组的首元素首地址