对指针的理解

文章讲述了数组指针和指针数组的概念区别,以及它们在C语言中的使用,包括数组指针如何指向一维数组和指针数组如何存储指针。还通过示例展示了如何运用一维数组创建二维数组,以及如何使用数组指针和常规指针访问数组元素。
摘要由CSDN通过智能技术生成

数组指针与指针数组

1、 “数组指针”也可以叫做“数组的指针”重点在“指针”,所以数组指针是一个指针,是一个什么样的指针呢?

2、“指针数组”也可以叫做“指针的数组”重点在“数组”,所以指针数组是一个数组,是一个什么样的数组呢?

3、然后明确一下优先级顺序:()>[ ]>*,所以(*p)[n]:根据优先级,先看括号里的,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针。

  • 数组指针int  (*p)[10]:p是指针,是指向10个整型数组元素类型的数组。
intintintintintintintintintint

*p[n]:根据优先级,先看[ ],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组

  • 指针数组int *p[10]:

*int*int*int*int*int *int*int*int*int*int

根据上面两个分析,可以看出,p是什么,则词组的中心词就是什么,即数组“指针”和指针“数组”。 

int *p1[5];
int (*p)[5];

 首先,对于语句“int *p1[5]",因为"[ ]"的优先级要比“*”的要高,所以p1先与“[ ]”结合,构成一个数组的定义,数组名p1,而“int *”修饰的是数组的内容,即数组的每一个元素。也就是说,该数组包含5个指向int类型数据的指针,如图1所示,因此,它是一个指针数组。

 其次,对于语句“int (*p2)[5]”,“()”的优先级比[ ]的优先级要高,“*”号和p2构成一个指针的定义,指针变量名为p2,而int修饰的数组的内容,即数组的每个元素。也就是说,p2是一个指针,它指向一个包含5个int类型数据的数组,如图2所示。很显然,它是一个数组指针,数组在这里没有名子,是个匿名数组。

由此可见,对于指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个一维数组的指针,在32位系统下永远占4个字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。 

 运用一维数组创建二维数组

#include<stdio.h>
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[]={2,3,4,5,6};
int arr3[]={3,4,5,6,7};
int *parr[3]={arr1,arr2,arr3};
int i=0;
int j=0;
for(i=0;i<3;i++)//代表arr1、arr2、arr3三行数组
{
for(j=0;j<5;j++)
{
printf("%d ",*(*(parr+i)+j));//(parr+i)是指向数组的首地址,
//每当i加1的时候parr就指向下一个数组的首元素的地址,
//*(parr+i)是指向数组解引用,*(parr+i)+j是指向该数组的下一个地址,
//*(*(parr+i)+j)是指向某个数组的具体的元素。
}
printf("\n");//每打印出一个arr1、arr2或者arr3换行
}
return 0;
}

运行代码 

 数组指针

#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int (*p)[10]=&arr;//数组指针
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<sz;i++)
{
printf("%d ",*(*p+i));//p是指向数组,*p其实就相当于数组名,数组名又是数组首元素的地址
//所以*p本质上是数组首元素的地址。
}


return 0;
}

 运用常规方法指针

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值