指针与数组

本文深入探讨了指针与数组的关系,包括指向数组的指针、指针数组、以及二维数组与指针的交互作用。解析了指针运算、数组访问、及行数组指针的概念,强调了指针变量与数组名的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 数组指针

  1. 指向数组的指针
  2. 对指针变量进行加法和减法运算时,是根据数据类型的长度来计算的 ∗ ( p + i ) = a [ i ] *(p+i) = a[i] (p+i)=a[i]
#include<stdio.h>

int main(){

    int a1[3] = {2,3,5};
    int *p1;
    p1 = a1;
    printf("*p1 = %d, *(p1+1) = %d, *(p1+2) = %d\n",*p1, *(p1+1), *(p1+2));

    int *p2;
    p2 = a1+2;
    //两个指针相减,为在数组中相差个数
    printf("p2-p1 = %d ,*p2 = %d",p2-p1,*p2);
   
    return 0;
}

2. 指针数组

  1. 数组中元素为指针
  2. a [ i ] a[i] a[i] 表示获取第 i i i 个元素的值,该元素是一个指针,还需要在前面增加一个 ∗ * 才能取得它指向的数据,即 ∗ a [ i ] *a[i] a[i]
  3. 定义二级指针指向数组首地址,通过二级指针访问数组中指针指向的元素
#include<stdio.h>

int main(){
    int i=14,j=24,t=34;
    //定义指针数组,数组中元素为指针,存放指针指向的地址
    int *a[3] = {&i,&j,&t};
    int **p;
    printf("*a[0] = %d, *a[1] = %d, *a[2] = %d\n",*a[0],*a[1],*a[2]);

    //定义二级指针指向数组首地址,通过二级指针访问数组中指针指向的元素
    p = a;
    printf("**p = %d, **(p+1) = %d, **(p+2) = %d\n",**p,**(p+1),**(p+2));

    return 0;

}

3. 二维数组与指针

  1. i n t ∗ p ; p = a [ 0 ] ; int *p; p = a[0]; intp;p=a[0]; p p p是指向一维数组的指针。 p + + p++ p++后, p p p指向 a [ 0 ] [ 1 ] a[0][1] a[0][1]
    i n t ( ∗ p 1 ) [ 4 ] ; ∗ ( p 1 + 1 ) = a [ 1 ] int (*p1)[4]; *(p1+1) = a[1] int(p1)[4];(p1+1)=a[1]
  2. a [ i ] [ j ] = ∗ ( p + i ∗ n + j ) = p [ i ∗ n + j ] a[i][j] = *(p+i*n+j) = p[i*n+j] a[i][j]=(p+in+j)=p[in+j]
  3. a [ 0 ] a[0] a[0]是一维数组的名字,指向 a [ 0 ] a[0] a[0]数组的首元素, ∗ a [ 0 ] *a[0] a[0]得到的是一个数组元素值,即 a [ 0 ] a[0] a[0]数组首元素值,因此, ∗ a [ 0 ] = a [ 0 ] [ 0 ] *a[0] =a[0][0] a[0]=a[0][0]
  4. a a a是一个二维数组的名字,它指向的是它所属元素的首元素,每一个元素都是一个行数组, a + i a+i a+i指向第 i i i个行数组,即 a [ i ] a[i] a[i] ∗ a = a [ 0 ] *a = a[0] a=a[0] i n t ∗ p int *p intp;, p p p的指向一个 i n t int int型数据,而不是一个地址,因此, p = a [ 0 ] p=a[0] p=a[0]
  5. 行数组指针, i n t ( ∗ p 1 ) [ 4 ] ; int (*p1)[4]; int(p1)[4]; ( ∗ p 1 ) (*p1) (p1)为第一行数组指针,第一行有4个元素。 ∗ ( p 1 + 1 ) *(p1+1) (p1+1) 为第二行
#include<stdio.h>

int main(){
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    
    int *p;
    p = a[0];

    //a的首地址,不能通过int **P ; p = a;将指针指向数组首地址,想通过指针可以使用*a,数组即指针
    printf("a = %d, a[0] = %d, &a[0] = %d, &a[0][0] = %d, a = %d, *a = %d\n",a,a[0],&a[0],&a[0][0],a,*a);
    //定义*p = a[0] ,后p所指向的值为数组首地址,即a[0]的值
    printf("p = %d, *p = %d, (p+1) = %d\n",p,*p,*(p+1));

    //a[1][0]的地址
    printf("a+1 = %d, *(a+1) = %d, a[1] = %d, &a[1] = %d, &a[1][0] = %d\n",a+1,*(a+1),a[1],&a[1],&a[1][0]);

    //访问a[0][0]元素值
    printf("*p = %d,*a[0] = %d, **a = %d\n",*p,*a[0],**a);

    //访问a[0][1]的值
    printf("a[0][1] = %d, *(a[0]+1) = %d, *(*(a)+1) = %d, *(p+1) = %d\n",a[0][1],*(a[0]+1),*(*(a)+1),*(p+1));

    //访问a[1][1]的值
    printf("a[1][1] = %d, *(a[1]+1) = %d, *(*(a+1)+1) = %d\n",a[1][1], *(a[1]+1), *(*(a+1)+1));


    //p访问二维数组元素
    printf("a[1][2] =%d, *(p+1*4+2) = %d, p[6] = %d\n",a[1][2],*(p+1*4+2),p[6]);

    //行数组指针,(*p1)为第一行数组指针,第一行有4个元素。(*p1+1) 为第二行
    int (*p1)[4];
    p1 = a;
    printf("*p1 = %d,a = %d, *(p1+1) = %d, a[1] = %d\n",*p1,a,*(p1+1),a[1]);
    printf("(*p1)[1] = %d, (*(p1+1))[2] = %d, *(*(p1+1)+2) = %d\n",(*p1)[1],(*(p1+1))[2],*(*(p1+1)+2));

    return 0;
}

注:

  1. 指针变量的值可以改变,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
  2. 数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值