目录
[2.2. 格式](#2.2. 格式)
[3.2. 二维数组和指针](#3.2. 二维数组和指针)
一、指针数组
1.1.什么是指针数组
指针数组是数组 ,而数组中的每个元素是指针
2.2. 格式
int *arry[5];
2.3.存储
由于指针数组的类型为指针(int *),因此指针数组的每个元素占 8个字节。
int *a[5];故此该指针数组占右8*5=40字节的空间。
2.4.与字符型二维数组相比
字符型二维数组用来存储字符串数组;
指针数组用来操作字符串数组;
2.5.什么时候使用指针数组
操作字符串数组时
2.6.练习
一起来加深一下指针数组的印象
1.定义一个指针数组,并初始化为12个月英文字符串首地址,从终端输入1 - 12对应的数字,
打印出其对应的英文形式。
cpp
#include <stdio.h>
int main(void)
{
char *p[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int n = 0;
scanf("%d", &n);
printf("%s\n", p[n-1]);
return 0;
}
2.再次练习终端接受字符串,使用指针数组对字符串数组的元素进行冒泡排序并打印结果,并使用数组的方法打印字符串。
cpp
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[5][32] = {0};
char *p[5] = {str[0], str[1], str[2], str[3], str[4]};
char *q = NULL;
int i = 0;
int j = 0;
for(i = 0; i < 5; i++)
{
gets(str[i]);
}
for(j = 0; j < 4; j++)
{
for(i = 0; i < 4 -j; i++)
{
if(strcmp(p[i], p[i+1]) > 0)
{
q = p[i];
p[i] = p[i+1];
p[i+1] = q;
}
}
}
printf("-----------------------------------\n");
for(i = 0; i < 5; i++)
{
printf("%s\n", p[i]);
}
printf("-----------------------------------\n");
for(i = 0; i < 5; i++)
{
printf("%s\n", str[i]);
}
return 0;
}
你会发现操作字符串时使用指针数组很方便,在使用冒泡排序时,原数组方法它要交换字符串来实现,而当字符串过大过多时效率很底;而指针数组在活得元素组字符串的地址后,交换时只需要交换地址就行效率很高。
二、数组指针
2.1.什么是数组指针
数组指针是指针,指针指向一个数组(二级指针)
2.2.格式
cpp
int (*p)[5] = NULL;
2.3.一维数组
一维数组的数组名是指向第一个元素的指针常量
cpp
int a[5] = {1,2,3,4,5};
a == &a[0]
一般情况,可以把数组名a理解为int *,但是存在两种特殊的情况不可以这么理解:
·sizeof运算时
sizeof(a) = 20
sizeof(int *) = 8
·&运算时
&a == int(*) [5](对一维数组取&会升级为数组指针)
&int * == int **
2.3.特点
1.对一维数组&得到数组指针
2.数组指针取*操作,类型不变,值降为指向数组第一个元素的指针
3.数组指针的变化量为整个数组大小
2.4.什么时候使用
二维数组传参数时,传数组指针和长度
cpp
int fun(int (*parry)[3],int len);
int a[2][3] = {0};
fun(a, 2);
三、指针和数组的关系
3.1.一维数组和指针
cpp
int a[5] = {1,2,3,4,5};
int *p = NULL;
p = a; / p = &a[0];
访问第n个元素的方式:
cpp
a[n] == *(a+n) == *(p+n) == p[n]
3.2. 二维数组和指针
cpp
int a[2][3] = {1,2,3,4,5,6};
int *p = NULL;
int (*p)[3] = NULL;
p = &a[0][0];
p = a[0];
q = a;
由于a[0]是由上图中的a[0][0]、a[0][1]、a[0][2]三个元素组成的一维数组,又有一维数组的数组名式是指向第一个元素的指针,故此p = a[0];
由于a[0][0]是a[0]数组的第一个元素,故此p = &a[0][0];
又由于a是由a[0]和a[1]两个一维数组组成的一维数组,又有一维数组的数组名式是指向第一个元素的指针,故此:q = a;
现在要访问第m行n列的元素,可以怎样访问:
cpp
a[m][n]
*(a[m]+n)
*(*(a+m)+n)
*(p+m*N+n)
*(q[m]+n)
*(*(q+m)+n)
q[m][n]
四、二级指针
4.1.含义
指向指针变量的指针
4.2.实际的二级指针
1.函数体内想修改函数体外指针变量值的时候,传指针变量的地址即二级指针
2.指针数组的数组名是指向数组第一个元素的指针,即指向指针的指针也就是二级指针
4.3.什么时候使用
1.函数体内想修改外部指针变量值传入二级指针
cpp
#include <stdio.h>
int fun(char **pptmp)
{
*pptmp = "hello world";
return 0;
}
int main(void)
{
char *p = NULL;
fun(&p);
printf("p = %s\n", p);
return 0;
}
结果为:p = hello world
2.指针数组的数组名是二级指针
五、总结
2024年7月24日,已经学习了12天啦!C语言的学习也接近尾声了。今天主要学习了指针数组、数组指针、二级指针,时指针中算是难的部分也是C语言中算是的难的部分了。努努力,争取今天消化了。
加油!