文章目录
一、指针数组
1.定义
指针变量也是C语言中的一种变量,因此指针变量也可以构成数组。若一个数组中所有元素都是指针类型,那么这个数组就是指针数组。给数组中每个元素都存放一个地址。
定义一维指针数组语法格式如下:
类型名* 数组名[数组长度];
例如:int* p[5];//定义了一个包含5个整型指针的指针数组
指针数组是一个数组,那么指针数组的数组名是一个地址,它指向数组中第一个元素。
指针数组的数组名实质是一个指向数组的二级指针。
一个单纯的地址没有意义,地址应作为变量的地址存在,所以指针数组中存储的指针应该指向实际的变量。
2.案例分析
假设使用一个字符型的指针数组a,依次存储多个字符串:
"hello world"
"this is a string"
"I am a boy"
该指针数组的定义为:
char* a[3]={"hello world","this is a string","I am a boy"};
数组名指向数组元素,数组元素指向变量,数组名是一个指向指针的指针。
数组名、数组元素、数组元素指针指向的数据之间的逻辑关系如下:
二、二级指针
一级指针是一个指向变量的指针,根据该指针找到的数据为普通变量;
二级指针是一个指向指针的指针,根据该指针可以找到指向变量的指针。
根据二级指针中存放的数据,二级指针分为指向指针变量的指针和指向指针数组的指针。
(1)指向指针变量的指针
定义一个指向指针变量的指针,格式如下:
变量类型** 变量名;
例如:
int a=10; //整型变量a
int* p=&a; //一级指针p,指向整型变量a
int** q=p; //二级指针q,指向一级指针p
根据运算符的结合性:上式等价于int* (*q)=p
*q是一个指针变量,而其变量类型为int*表示该变量指向的仍是一个int*的数据。
(2)指向指针数组的指针
假设定义一个指针p,使其指向指针数组a[],定义语句如下:
char *a[3]={0};
char **p=a;
解析:p是指向指针型数据的指针变量,初始时为指针数组a的首元素a[0],a[0]为指针型数据,指向一个char型数组的首元素,而p初值为该元素的地址
案例实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char buf[1024];//定义缓存数组
char* strArray[1024];//定义指针数组
char** pArray;//定义二级指针
int arraylen = 0;
printf("录入数据开始:\n");
while (1) {
scanf("%s", &buf);
if (strcmp(buf, "end") == 0) {
printf("数据录入结束\n");
break;
}
//为指针数组中的指针元素开辟空间
strArray[arraylen] = (char*)malloc(strlen(buf) + 1);
//将缓冲区的字符串赋值给指针元素指向的空间
strcpy(strArray[arraylen], buf);
arraylen++;
}
//为二级指针申请len个char*型的存储单元
pArray = (char**)malloc(sizeof(char*) * arraylen);
for (int i = 0; i < arraylen; i++) {
//为二级指针指向的存储单元一一赋值
*(pArray + i) = strArray[i];
}
printf("数据输出:\n");
for (int i = 0; i < arraylen; i++) {
printf("%s\n", *(pArray + i));
}
//数组指针空间释放
for (int i = 0; i < arraylen; i++) {
free(strArray[i]);
}
//释放二级指针
free(pArray);
}
运行结果: