初识C语言指针(二)指针数组,数组指针 ,函数数组

一.数组指针

1.数组指针概念

指针可以存放某一元素的地址, 数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。

那么,当一个数组里面包含多个元素时,多个元素的地址该如何存放,下面引入数组指针的概念 数组指针,理解为放数组地址的指针,



int *p=&a; p是变量名,*p表示指针,剩下的int是指向的元素类型;

 int(*p)[10]=&arr;p是变量名,*p表示指针,剩下的int[10]是指向十个int类型元素的地址;

举例利用指针打印数组

#include <stdio.h>

int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    int (*p)[10]=&arr;
    for(int i=0;i<10;i++)
    {
        printf("%p\n",p);
    }
}

4e186bbde2bf4422a1df4fbad86295f8.jpeg2.对于二维数组,指针该如何书写? 前面讲述一维数组指针,

int(*p)[10]=&arr//&+数组名表示一维数组指针指向首元素地址 对于二维数组

int arr[2][3]={1,2,3,4,5,6}; //此时我们设想:&+数组名表示第一行元素地址

#include<stdio.h>
int main()
{
    int arr[2][3]={1,2,3,4,5,6};
    int(*p)[3]=arr;
    printf("%d",(*p)[0]);
    printf("%d",(*p)[1]);
    printf("%d",(*p)[2]);
    return 0;
}

 

二.二维数组的传参打印

从运行结果看出 对于二维数组:&+数组名表示第一行元素地址,使用数组指针接收 下面讨论利用指针实现一维数组,二维数组的传参打印

1.一维数组

 

#include<stdio.h>
void print(int*p,int x)
{   
    
    for(int i=0;i<x;i++)
    {
        printf("%d",*p+i);
    }
}
#include<stdio.h>
int main()
{
    int arr[3]={1,2,3};
    print(arr,3);
}

4698dc8a88194b79aa5f54bcd3549be9.jpeg*p表示解引用数组首元素,*p+i表示解引用数组第i个元素

2.二维数组 我们打算创建一个打印函数print2实现对二维数组打印

考虑函数参数有接收二维数组的地址(使用数组指针接收),行和列

 

#include<stdio.h>
void print(int(*p)[3],int x,int y)
{   
    for(int i=0;i<x;i++)
    {
        for(int j=0;j<y;j++)
        {
            printf("%d",p[i][j]);
        }
    }
}
#include<stdio.h>
int main()
{
    int arr[2][3]={1,2,3,4,5,6};
    print(arr,2,3);
    return 0;
}

 

779b8b1a51f44583a22aa0187a7c258c.jpeg解析: 1.借助两个for循环和数组指针实现对二维数组的打印。

2.二维数组arr[2][3]传参,传过去的是带一行元素的地址,使用一维数组int(*p)[3]指针接收(也可使用二维数组接收后面会出专门文章)

三.函数指针

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。 有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。 函数指针有两个用途:调用函数和做函数的参数。

#include<stdio.h>
int Add(int x,int y)
{
    return x+y;
}
int main()
{
    int a=1;
    int b=2;
    int (*pa)(int ,int)=Add;//函数指针
    //*pa是函数名,去掉函数名后是函数参数类型,表是返回类型为int,参数类型为2个int的函数指针
    int c=(*pa)(a,b);
    printf("%d",c);
}

bca046202e7948d986137185398eca9b.jpeg

 

 

 

 

 

 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河清风悠

你的鼓励就是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值