指针与数组

        上次和朋友聊飞手去了,就留了个标题在这,今天接着上次的内容开始

        多维数组与指针

        之前说到了数组名在 typeof  sizeof  &,这三种情况是指整个数组,其他情况都是指指针,然后我们来看看具体的几个运算

        ______________________________
 a + 1
    此处数组名a ,当指针用
    a + 1 ==> &a[0] + 1 ==> &a[1]
 &a[1]
     与 &a[1][0] 仅数值相同,含义和类型完全不一样!!!
______________________________
 a[0] + 1
     此处数组名a[0] ,当指针用
      a[0] + 1  ==> &a[0][0] + 1 ==> &a[0][1]
_______________________________
  *((a + 1) + 1)
      此处数组名a,当指针用
      *((a + 1) + 1)==>*((&a[0] + 1) + 1)
                    ==>*(&a[1] + 1)
                    ==>*(&a[2])
                    ==>a[2]          
  *(*(a + 1) + 2)
      此处数组名a,当指针用
      *(*(a + 1) + 2)==>*(*(&a[0] + 1) + 2)      
                     ==>*(*(&a[1]) + 2)//注意这里先结合了*&
                     ==>*(a[1] + 2)//所以这里就变成了a[1]这个指针,a[1]是第一行的首地址,代表整个第一行,所以是a[1][0]+2         
                     ==>*(&a[1][0] + 2)
                     ==>*&a[1][2]
                     ==>a[1][2]
  *(a[1] + 2)         
             ==>a[1][2]

int b[4];//b是一个含有4个int类型的元素
        //typeof(b) : int[4]
                      元素类型 [元素个数]
int a[3][4];//a是一个含有3个元素,且每个元素又是4个int的数组 的数组
        //typeof(a) : int[4] [3]
                      元素类型 [元素个数]

//再重复一遍为什么所有维度的数组都可以解释成一维数组

数组指针和指针数组

        数组指针

        首先我们要知道,数组指针到底是数组还是指针?我们从定义上来看。数组指针就是一个指向数组的指针,所以数组指针其本质上是指针。

        那么如何去定义一个数组指针呢

 int a[4];

//定义一个指针p , 指向数组a
typeof(a) *p;//定义p
    typeof(a) *p;==> int[4] *p; ==> int (*p)[4]
int (*p)[4] ;//int[4] *p

        定义一个数组指针

#include<stdio.h>
int main()
{
    int a[3][4] = {
    1,2,3,4,
    5,6,7,8,
    9,10,11,12
};
int (*p)[4];
p = a;
printf("%d\n",p[1][2]);//7
return 0;
}

        指针数组

        这就是一个数组里面储存的全部都是int*类型的元素,所以指针数组是一个数组,只不过数组里面的元素全部都是指针。

        

int * p[4];//p是一个数组,里面有4个元素,元素的类型是 int*

数组定义格式 :
    元素类型  数组名[元素个数]
      int*    p    [4]
      
int (*p)[4];//p是一个指针,指向一个数组

        用指针数组输出一个数组:

#include<stdio.h>
int main()
{
    int a[3] = {0,1,2};
    int* p[3];
    for(int i = 0 ;i<3;i++)
    {
        p[i] = a+i;//&a[i]这两种写法都是一样的
    }
    for(int i = 0;i<3;i++)
    {
        printf("%d\n",*p[i]);
    }
    return 0;
}

            指针作为函数的参数

        前面我们在复习函数的章节的时候就提到过,整型在作为函数的参数的时候,形参和实参是分别占用不同的内存的,所以你在写交换函数(swap)的时候一般就会去使用指针,直接交换地址(因为前面已经重点提过了,这里不再说)

#include<stdio.h>
void swap(int*a,int*b)
{
    int temp;
    temp  = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int h = 1;
    int p = 2;
    swap(&h,&p);//注意这里参数的类型是指针类型所以要写成&h,&p
    printf("h=%d p=%d",h,p);
    return 0;
}

         数组作为函数的参数

        这个前面也有提到过一些,我们今天就来把形参和实参为什么要那样写来搞清楚

#include<stdio.h>
int find_max(int a[],int n)//在这里可以把int a[]改为int* a会更好理解
{
    int max = a[0];
    for(int i = 0;i<n;i++)
    {
        if(max<a[i])
        {
            max = a[i];
        }
    }
    return max;
}
int main()
{
    int h [3] = {0,1,2};
    find_max(h,3);//h很明显在这里当指针用了,
    //我们说形参和实参一一对应所以int a[]是一个指针类型哦,当然最好还是改成int* a更好。
    printf("%d",find_max(h,3));
    return 0;
}

int find_max(int b[],int n);
 
    在接收实际参数 数组a时:
        b = a //此时数组名 a 当指针用
      ==>
        b = &a[10];//typeof(&a[0])==>typeof(a[0])*==>int *
函数的形式参数:
    int b[] ==> int *b //b就是一个指针
==>
    int find_max(int *b,int n);//这样的写法会更容易让人理解和接受

        今天先把数组和指针搞定,明天在继续搞指针和函数的关系,,,,,最要是运筹学作业真太多了,无了个大语天天都要写

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值