前言:
此时我们对“数组指针和函数指针都是指针变量”都比较讲究,你们都想要了解一些“数组指针和函数指针都是指针变量”的相关知识。那么小编在网摘上收集了一些对于“数组指针和函数指针都是指针变量””的相关内容,希望小伙伴们能喜欢,朋友们快快来学习一下吧!1.指针数组
即指针的数组,本质是一个数组,数组的每个元素都是指针变量
定义指针数组,含有4个元素,每个元素都是一个char *类型的指针,指向字符串
char *p[] = { "lemon","C language","hello world","=.=!" };
直接将p[0],p[1]等当作普通指针使用:
for (int i = 0; i < sizeof(p) / sizeof(char *); i++)//sizeof(p) / sizeof(char *)为求指针数组的元素个数
{
printf("%s\t", p[i]);
}
printf("\n");
for (int i = 0; i < sizeof(p) / sizeof(char *); i++)
{
do
{
printf("%c", *(p[i]));//p[i]表示第i个字符串的指针,外面加*代表取该指针指向的内容
p[i]++;//p[i]++表示指向该字符串的指针向后移动一位
} while (*(p[i]) !='\0');
printf("\n");
}
输出结果为:
2.数组指针
即指向数组的指针,本质是一个指针,指向一个数组
2.1一维数组
int a[10] = { 0 };//定义一个一维数组
定义数组指针的三种方式:
(1)先定义数组类型(使用typedef),再根据数组类型定义数组指针变量
typedef int A[10];//定义了一个数组类型A,该类型的数组有且只能有10个元素
A *p1 =NULL;//使用数组类型定义一个指针变量p1,初始化为NULL
p1 = &a;//使用&a,让p1指向整个数组,不能使用p1=a,a是首元素地址
//使用
for (int i = 0; i < 10; i++)
{
//p=&a
//*&a <==> a
//*p=*&a ==> (*p)[i]=a[i] ()与[]优先级相同,从左到右结合,*优先级较低
(*p1)[i] = i+1;
printf("%d ", (*p1)[i]);
}
输出结果为:
(2)先定义数组指针类型,再根据类型定义变量
typedef int(*P)[10];//定义了一个数组指针类型P
P p2 = NULL;//使用定义的数组指针类型P,定义了一个数组指针变量p2,初始化为空
//p2只能指向一个有10个元素的int型一维数组
p2 = &a;//将数组a的数组地址赋值给p2
//使用相同
for (int i = 0; i < 10; i++)
{
(*p2)[i] = i + 2;
printf("%d ", (*p2)[i]);
}
输出结果为:
(3)直接定义数组指针变量
int(*p3)[10] = &a;
//使用相同
for (int i = 0; i < 10; i++)
{
(*p3)[i] = i + 3;
printf("%d ", (*p3)[i]);
}
输出结果为:
2.2二维数组
int b[][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//定义一个三行四列的二维数组
//定义一个指向一维数组的数组指针变量,并初始化为空
int(*p4)[4] = NULL;
p4 = b;//将二维数组b的第0行的首行地址赋给p4
//这里不能使用p4=&b,&b指的是整个二维数组,定义的是一维数组指针
//使用
for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++)
//sizeof(b)是求整个数组的大小,sizeof(b[0])是求第0行的大小
//sizeof(b) / sizeof(b[0])即可得到数组有多少行
{
for (int j = 0; j < sizeof(b[0]) / sizeof(b[0][0]); j++)
//sizeof(b[0][0])是求第0行第0个元素的大小
//sizeof(b[0]) / sizeof(b[0][0])即可得到每行有多少个元素
{
printf("%d ", p4[i][j]);
//等价于printf("%d ", *(*(p4+i)+j));
}
printf("\n");
}
输出结果为:
关于b和&b的区别,p4[i][j]与*(*(p4+i)+j)等价的详细介绍
可见