//指针数组和数组指针
//指针数组是一个存放指针的数组。
1、
#include<stdio.h>
int main(){
int arr1[]={1,2,3,4,5};
int arr2[]={2,3,4,5,6};
int arr3[]={3,4,5,6,7};
int* p[]={arr1,arr2,arr3};
int i=0;
for(i=0;i<3;i++){
int j=0;
for(j=0;j<5;j++){
printf("%d ",*(p[i]+j));
}
printf("\n");
}
return 0;
}
2、
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("arr = %p\n",arr);
printf("&arr= %p\n",&arr);
printf("arr+1 = %p\n" , arr+1);
printf("&arr+1= %p\n" , &arr+1);
return 0 ;
}
根据上面的代码我们发现,其实&arr和arr ,虽然值是一样的,但是意义应该不一样的。 实际上:&arr表示的是数组的地址 ,arr是数组首元素的地址。数组的地址+1 ,跳过整个数组的大小,所以&arr+1相对于&arr 的差值是40.
//数组指针是一个指向数组的指针,存放数组的地址
1、
int (*p)[10];
//p先和*结合,说明p是一个指针变量,然后指向一个大小为10的整型的数组,所以p是一个指针,指向一个数组
//[]的优先级高于*号的,所以要加括号
2、
char* arr[5];
char*(*pa)[5]=&arr;
//pa是指针变量的名字
//括号内的*说明pa是指针
//char*表示指向的数组的元素类型是char*
//[5]表示指向的数组有5个元素
3、
//参数为数组的形式
#include <stdio.h>
void print_arr1(int arr[3][5], int x, int y)
{
int i = 0 ;
for(i=0;i<x;i++)
{
int j=0;
for(j=0;j<y;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
//参数为指针的形式
//*arr中的*说明arr是指针,[5]说明指向数组是5个元素的,int说明指向数组的类型是int型
void print_arr2(int(*arr)[5],int x,int y)
{
int i=0;
for(i=0;i<x;i++)
{
int j=0;
for(j=0;j<y;j++)
{
//二维数组类似于一维数组,可参考下面的一维数组可得出同等结论
//输出二维数组里的每个元素
printf("%d ",arr[i][j]);
//先得到行首元素下标,然后每行都从首个元素开始加j,得到整个二维数组的地址,然后解引用,从而得到二维数组的每个数字
printf("%d ",*(arr[i]+j));
//得到行地址后直接解引用,所以*(arr+i)等同于arr[i],得到每行首元素再遍历j,由[j]得到所有元素
printf("%d ",(*(arr+i))[j]);
//*(arr+i)(等价于arr[i])找到每一行,拿到每一行的数组名(等价于拿到首元素下标),*(arr+i)+j,找到下标为j的地址,最后将每一行的j都解引用即可得到整个数组的数字
printf("%d ",*(*(arr+i)+j));
}
printf("\n");
}
}
int main()
{
int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
print_arr1(arr , 3 , 5);
//数组名arr,表示首元素的地址
//但是二维数组的首元素是二维数组的第一行
//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
//可以数组指针来接收
print_arr2(arr , 3 , 5);
return 0 ;
}
4、
//一维数组的四种输出方式
#include<stdio.h>
int main(){
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int i=0;
int* p=arr;
for(i=0;i<10;i++)
{
//四个输出的形式有所不同,但是表达的结果是一样的,都是打印arr数组
//p所指向的就是arr的地址,即数组首元素的地址,所以两者都可以遍历数组,解引用以后输出数组内数字
printf("%d ",*(p+i));
printf("%d ",*(arr+i));
//arr[],[]里面是数组下标,遍历下标即是遍历数组内数字,同样,p等于arr,所以p[]意义和arr[]一样
printf("%d ",arr[i]);
printf("%d ",p[i]);
}
return 0;
}
5、在实际应用过程中,在以为数组中并不常用数组指针,数组指针可能更常见于二维等更高维的数字中,但是我们也应该掌握这个知识点。
C语言基础 数组指针和指针数组
最新推荐文章于 2022-10-26 17:30:26 发布