指针进阶(一)

本文详细介绍了C语言中的数组指针和指针数组的概念及用法,包括一维和二维数组的传参方式。通过实例代码解析了数组指针与指针数组的区别,如`&arr`与`arr`的差异,以及在函数参数传递中的一维和二维数组处理。同时,文章强调了理解这两种概念对于编程的重要性。
摘要由CSDN通过智能技术生成


本篇梗概

  1. 数组指针与指针数组
  2. 数组参数,及指针相关用法

一、数组指针与指针数组

  • 数组指针

    数组指针是一个指针, 存放的是数组的地址

    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");
	}
}


总结

以上就是本篇文章的内容,介绍了指针数组和数组指针的基本概念与用法,一维数组二维数组等知识。成长不是一蹴而就的,重要的是每天都更进一步~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值