【C语言】指针数组和二级指针 |
您所在的位置:网站首页 › c语言中的指针数组 › 【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 #include #include 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); }运行结果: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |