【C语言】指针数组和二级指针

文章目录

一、指针数组

1.定义

2.案例分析

二、二级指针

(1)指向指针变量的指针

(2)指向指针数组的指针


一、指针数组

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);
}

运行结果: 

猜你喜欢

转载自blog.csdn.net/Jacky_Feng/article/details/109032712