数组指针与指针数组
数组指针
概念:数组指针是指向数组的指针,本质上还是指针
特点:
-
先有数组,后有指针
-
它指向的是一个完整的数组
一维数组指针:
-
语法:
数据类型 (*指针变量名)[行容量][列容量];
-
案例:
//数组指针:指向数组的指针(这里不是指向数组元素的指针)
int mian()
{
//一维数组指针
//先有数组,再有指针
int arr[] = {100,200,300};
//获取数组的元素个数
int len = sizeof(arr)/sizeof(arr[0])
// int *p = arr;//实际上指向了数组的第一个元素 p++
//定义一个数组指针,指向arr这个数组
int (*p)[3] = &arr; //此时p不是指向arr数组的第一个元素,而是指向arr这个数组本身
printf("%p",p);
// p++; 此时p++会跳出整个数组,访问到一块未知的内存,程序中尽量避免这种写法
// 如何访问数组指针
printf("%d\n",(*p)[2]); // 300
//遍历
for(int i = 0; i < len; i++)
{
printf("%d\n",(*p)[i]);
}
return 0;
}
我们之前所学的是指向数组元素的指针,本质上还是指针变量;现在我们学的是指向数组的指针,叫做数组指针。
二维数组指针:
-
语法:
数据类型 (*指针变量名)[容量];
-
案例:
写法1:
#include <stdio,h>
int main()
{
//创建一个普通的二维数组
int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
int len = sizeof(arr)/sizeof(arr[0]);
//创建一个二维数组指针
//一个二维数组本质上还是一个一维数组,只不过它的元素也是数组
int (*p)[3][3] = &arr;
printf("%d",(*p)[1][0]);
//遍历
for(int i = 0; i < len; i++)
{
for(int j = 0; j < len ; j++)
{
printf("%-5d\n",(*p)[i][j]);
}
printf("\n");
}
}
写法2:
#include <stdio,h>
int main()
{
//创建一个普通的二维数组
int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
int len = sizeof(arr)/sizeof(arr[0]);
//创建一个二维数组指针
//一个二维数组本质上还是一个一维数组,只不过它的元素也是数组
int (*p)[3] = arr; // 10
printf("%d",(*p)[0]); //10
//获取元素2000
//三种写法:内部为行,外部为列
printf("2000-%d,%d,%d",*(*(p+2)+1),*(p[2]+1),p[2][1]);
return 0;
}
-
指针和数组中符号优先级:
()> [] > *
-
通过指针引用多维数组
案例1
需求:用指向元素的指针变量输出二维数组元素的值
#include <stdio.h>
//用指向元素的指针变量指向二维数组元素的值
int main()
{
//定义一个普通的二维数组
int arr[3][4] = {1,3,5,7,9,11,13,15,17,19.21.23};
//定义一个指针变量,用来接收二维数组的元素值
int *p = arr[0]; // &arr[0][0]
//循环遍历
for(;p < arr[0] + 12;p++)
{
//每4个换行
if((p - arr[0]) % 4 ==0)
{
printf("\n");
}
printf("%-4d",*p)
}
printf("\n");
return 0;
}
案例2
需求:数组指针-输出二维数组任一行一列元素的值
#include <stdio.h>
//数组指针-输出二维数组任一行一列元素的值
int arr_main1()
{
//定义一个二维数组
int arr[3][4] = {1,3,5,7,9,11,13,15,17,19.21.23};
//创建一个一维的数组指针指向二维数组
int (*p)[4] = arr; //等价于&arr[0] , p代表我们这个二维数组
// 创建两个变量,代表我们对应数据的行和列
int row,col;
//通过控制台来输入
printf("请输入行号和列号:\n");
scanf("%d,%d",&row,&col);
printf("arr[%d][%d] = %d\n",row,col,*(*(p+row)+col));//*(*(p+row)+col),*(p[row]+col),p[row][col]
}
int main()
{
return 0;
}
指针数组
概念:指针数组是一个数组,数组中的每一个元素都是一个指针
特点:
-
先有指针,后有数组
-
指针数组的本质是一个数组,只是数组中的元素类型为指针
语法:
数据类型 *数组名[容量]; int *arr[4];//int (*arr)[4] 这个是数组指针
#include <stdio.h>
int main()
{
// 定义三个变量
int a =10,b = 20,c = 30;
//定义指针数组,指针数组用来存放指针的
int *arr[3] = {&a,&b,&c};
//获取数组大小
int len = sizeof arr / sizeof arr[0];
//遍历数组
for(int i = 0 ; i < len ;i++)
{
printf("%-3d",*arr[i]);//输出每个指针指向的值,需要解引用
}
return 0;
}
建议:我们一般使用指针数组处理字符串