【c语言】指针数组和数组指针-解释和用法

本文深入探讨了数组指针与指针数组的概念及其区别,解释了int(*p)[3]与int*p[3]的不同含义。通过实例演示了如何定义和使用这两种类型的变量,以及在C语言中正确赋值的方法。

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

数组指针与指针数组:

优先级:()>[]>*

首先我们要说的一个知识点是
int *p[3]   和  int (*p)[3]的区别

 int (*p)[3]   因为()优先级高,首先说明p是一个指针,指向一个int型的一维数组, 数组有3个元素,每个元素是一个int型整数
简单来说,就是int (*p)[3]是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已  

而int *p[3]  [ ] 优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组指针数组本身就是个数组,只不过这个数组里存放的不是int 不是char,而是一个指针类型( int*,char* ),也就是就是地址 

所以:
数组指针:它是一个指针,它指向一个数组  
指针数组:它是一个数组,数组的元素都是指针

 

这里我们可以这样理解:

 数组指针 :指向数组的指针    本质是指针

 指针数组 :存放指针的数组    本质是数组

也就是什么在后面,他就是什么类型,比较容易理解把

 

数组指针的定义即使用:

 int (*p)[3];    //指向一个数组,数组有3个元素,每个元素是一个int型整数
 int a[3][3];
 p= a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
 p= &a;     //这样是错误的

如果为一维数组

int (*p)[3];  //定义数组指针
int a[3];     //定义一维数组
 p= &a;       //需要&符
 p= a;        //这样是错误的

这里为什么与要加上&呢     因为  p 本质是一个指向整个数组的指针  &a 代表的是整个数组的首地址,指向了整个数组     a代表的是数组首个元素的地址 是一个单纯的地址  (&a 与 a在数值上相同)  而在C语言中,赋值符号“=”号两边的数据类型必须是相同的p= &a; 是将整个数组的首地址赋值给p而p= a;  则是将一个指针赋值给p 这样子是错误的

同理,如果是二维数组 a则直接表示一个一维数组的首地址(a[][3])  而&a 则表示一个二维数组的首地址 所以赋值会出现错误

数组的定义即使用:

int *p[3];   //定义指针数组
int a[3];     

p[0] = a[0]; //p第一个元素存放a的第一个元素的地址
p[1] = a[1]; //p第二个元素存放a的第二个元素的地址

  有时我们需要用到一些特定的数值作为参数调用时,需要保存多个地址的时候 ,就可以使用指针数组

#include<stdio.h>
char *(number)[10]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};  //里面都是对应汉字的首地址
char number2[10]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};  //直接定义是错误的
char number3[3];
void transform(char *num);
int main()
{
    transform(*number);  //这里需要*
    transform(number3);
}
void transform(char *num)
{
}

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Z小旋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值