本篇梗概
- 数组指针与指针数组
- 数组参数,及指针相关用法
一、数组指针与指针数组
-
数组指针
数组指针是一个指针, 存放的是数组的地址
int * pint; 是一个能够指向整形数据的指针。
float * pf; 能一个够指向浮点型数据的指针。
int (p)[10];是一个数组指针,这里要注意,由于【】的优先级高于 * ,所以必须加上()来保证p先和结合。
int *p1[10];是一个指针数组
-
指针数组
指针数组是一个数组,是一个存放指向数组中每个元素的指针的数组
1,数组指针的用法
先看一个代码:
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int (*p)[10] = &arr;//把数组arr的地址赋值给数组指针变量p
//但是我们一般很少这样写代码
return 0; }
一个数组指针的使用:
#include <stdio.h>
void print_arr1(int arr[3][5], int row, int col) {
int i = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print_arr2(int (*arr)[5], int row, int col) {
int i = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10};
print_arr1(arr, 3, 5);
//数组名arr,表示首元素的地址
//但是二维数组的首元素是二维数组的第一行
//所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址
//可以数组指针来接收
print_arr2(arr, 3, 5);
return 0; }
2,指针数组的用法
一个指针数组的使用:
void main()//
{
int ar[3] = {1,2,3};
int *p1 = &ar[0];
int *p2 = ar;
int(*p3)[3] = &ar;
int **p3 = &ar;//我们可能经常会看到这种写法,这种写法在C语言中可能不会报错,但是在C++中几乎一定会出错。因为这种写法实际上是把ar当做一个指针,并再对ar取地址,就得到了一个二级指针,而这种思想与事实相违背,所以尽量杜绝。
}
定义一个指向数组的指针(数组指针)
void main()
{
int ar[3][5] = {0};
int *p1 = &ar[0][0];
int (*p2)[5] = ar;\\ar为数组的首地址,而ar每一行为一个元素,为了接收ar第一个元素的地址,需定义一个含有五个空间的一维数组指针
int(*p3)[3][5] = &ar;\\&ar为整个数组的地址,为了接收整个数组,定义的指针数组的维度应该和数组ar相同
}
3、&数组名VS数组名
先看一个程序:
#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; }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCxJukBQ-1618368607531)(C:\Users\84136\AppData\Roaming\Typora\typora-user-images\image-20210414031753636.png)]
此处&arr表示的是数组的地址,不是数组首元素的地址。arr表示的是数组的首地址,也就是数组首元素的地址。
数组的地址+1,跳过整个数组的大小,所以&arr+1相对于&arr的差值是40
二,数组参数
1,一维数组传参
先看一个程序:
void PrintArray(int ar[], int n)//更推荐这种写法
{
for(int i=0; i<n; ++i)
{
printf("%d ", ar[i]);
}
printf("\n");
}
void PrintArray1(int *ar, int n)
{
for(int i=0; i<n; ++i)
{
printf("%d ", ar[i]);
}
printf("\n");
}
//两种传参方式完全相同,因为传入的实际都是数组首地址。故还需要传入数组元素的个数
void main()
{
int ar[N] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(ar) / sizeof(ar[0]);
PrintArray(ar, N);
PrintArray1(ar, N);
}
2,二维数组传参
void PrintArray2(int br[][COL], int row, int col)//传递二维数组的时候可以省略行数,但是列数一定不能省,因为此处本质上是定义了一个‘数组指针’来接受二维数组的首元素地址,而二维数组的首元素是该数组的第一行
{
for(int i=0; i<row; ++i)
{
for(int j=0; j<col; ++j)
{
printf("%d ", br[i][j]);
}
printf("\n");
}
}
总结
以上就是本篇文章的内容,介绍了指针数组和数组指针的基本概念与用法,一维数组二维数组等知识。成长不是一蹴而就的,重要的是每天都更进一步~