[c语言]-指针数组,数组指针

本文详细解析了指针数组与数组指针的概念及其应用。通过具体实例介绍了如何定义和使用这两种指针类型,并展示了如何通过指针操作访问一维及多维数组中的元素。

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

1  指针数组 ——是数组,数组中的每个元素是指针

#include <stdio.h>

int main()
{ 
	int a=1, b = 2, c= 3;
	int *pa[3] = {&a, &b, &c};
	printf("%d,%d,%d \n",*pa[0], *pa[1], *pa[2]);    //1,2,3
 	
	// 二级指针指向指针数组
	int **pp = pa;
	printf("%d,%d,%d",**pp,  **(pp+1),**(pp+2));  // 1,2,3
		
   return 0;
}

pa数组名,pa[0] pa[1] pa[2] 是数组中的元素,因为数组中的元素也是指针类型,所以需要添加‘*’来获得实际的变量值。 

 

2 数组指针 ——是指针, 该指针指向元素的类型是数组。

#include <stdio.h>

int main()
{ 
	// [一维数组]
	int arr[3] = {111,222,333} ;
	int (*p)[3] = &arr;   //p 代表数组的地址; *p代表首元素的地址 
	printf("%d-%d-%d\n",**p,*(*p+1), *(*p+2)); // 111-222-333
	
	// [二维数组] 使用二级指针 指向数组指针
	int arr2[2][3] = {{111,222,333},{444,555,666}};
	int (*pp)[3] = arr2; 
	
	printf("%d-%d-%d\n",**pp,*(*pp+1), *(*pp+2));	  // 111-222-333
	printf("%d-%d-%d\n",**(pp+1),*(*(pp+1)+1), *(*(pp+1)+2)); // 444-555-666
	// *(pp+1) = p[1]
	printf("%d-%d-%d\n",*(pp[1]+0),*(pp[1]+1), *(pp[1]+2)); // 444-555-666
    return 0;
}

找规律,方便记忆:

int arr[3] = {111,222,333} ;

int arr2[2][3] = {{111,222,333},{444,555,666}};

一维数组和二维在定义 数组指针时,没有任何区别;

二维数组在访问第1个元素(第1个一维数组中的各个元素)和访问一维数组时没有任何区别;

二维数组在访问第2个元素(第2个一维数组中的各个元素),只要将pp = pp+1 做同等替换即可,以此类推!

3 练习:三维数组的访问

    --按第一维度拆分,将三维数组拆分中若干二维数组处理。

#include <stdio.h>

int main()
{
  
   int a[][2][3] = {
         {
            {11,22,33},
            {44,55,66}
         },
         {
            {111,222,333},
            {444,555,666}
         },
   };

  int (*pa)[2][3] = a;

  //int len = sizeof(a) / (sizeof(int)*2*3);   // 第一维度的大小 dim可通过该方法获得
  //printf(" dim=%d \n", len);

  // a 可分为2个 二维数组, 按照普通的二维数组指针进行处理
  int(*pa1)[3] = pa[0];
  int(*pa2)[3] = pa[1];  

  printf("%d-%d-%d \n", **pa1,*(*pa1+1),*(*pa1+2));               // 11-22-33
  printf("%d-%d-%d \n", **(pa1+1),*(*(pa1+1)+1),*(*(pa1+1)+2));   // 44-55-66 

  printf("%d-%d-%d \n", **pa2,*(*pa2+1),*(*pa2+2));               // 111-222-333
  printf("%d-%d-%d \n", **(pa2+1),*(*(pa2+1)+1),*(*(pa2+1)+2));   // 444-555-666


   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值