指针和一维数组

本文介绍了C语言中直接访问与间接访问的概念,通过实例展示了指针与一维数组的关系,包括如何通过指针获取数组元素和地址。同时,文章探讨了指针自增操作的各种形式及其对数组元素的影响,强调了地址常量不能被赋值的特性。
摘要由CSDN通过智能技术生成

什么是直接访问
通过变量的地址来存取变量的值(数组名)。
什么是间接访问?
通过存放变量地址的变量去访问变量(指针)。

我们简单了解一下指针,设一个变量a,并初始化指针

#include<stdio.h>
int main()
{
	int a={};
	int *p = a;//p指针所指向地址的值为变量a的值
	return 0;
}

而今天我们要看的是指针和一维数组的关系,简单设一个一维数组a,并给它初始化

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	return 0;
}

区别在于:a是地址常量;p是指针变量。
要注意的是,千万不能给地址常量赋值!!!

1.用指针获取地址和取数组地址相同

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%p %p\n",a,a+1);//获取第一个元素 第二个元素的地址
	printf("%p %p\n",p,p+1);//同样也是获取地址
	return 0;
}

取一维数组地址
2.用指针获取元素和取数组元素相同
法一:

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d %d\n",*a,*(a+1));//获取第一个 第二个元素
	printf("%d %d\n",*p,*(p+1));//同样也是获取元素
	return 0;
}

取一维数组元素方法一
法二:

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d %d\n",a[0],a[1]);//获取第一个 第二个元素
	printf("%d %d\n",a[0],a[1]);//同样也是获取元素
	return 0;
}

取一维数组元素方法二
一维数组的地址和元素对应图

访问a[i]元素的值:
	直接访问:	*(a+i)  	a[i]
	间接访问:	*(p+i)   	p[i]
访问a[i]的地址:
	直接访问:	&a[i]  		a+i
	间接访问:  	&p[i]  		p+i

接着我们引出一个经典错误

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d\n",*a++);
	return 0;
}

*a++所犯的错误
报错,是因为a是地址常量,前文说到,不能给地址常量赋值。

然后我们来讨论 *p++ , *(p++) , (*p)++ , ++(*p) , *++p , *(++p)它们之间的区别

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d\n",*p++);//结果是2
	printf("%d\n",*p);//结果是6
	return 0;
}

*p++
对于* p++先取*p , 然后p自加;
指针指向第二个元素

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d\n",*(p++));//结果是2
	printf("%d\n",*p);//结果是6
	return 0;
}

*(p++)
对于*(p++)先取*p , 然后p自加;
指针指向第二个元素

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d\n",(*p)++);//结果是2
	printf("%d\n",*p);//结果是3
	return 0;
}

(*p)++
对于(* p)++先取 * p , 然后* p自加
*p 取到2,赋值。再加一,赋值。

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d\n",++(*p));//结果是3
	printf("%d\n",*p);//结果是3
	return 0;
}

++(*p)
对于++(* p)先取 * p , 然后* p自加
*p 取到2,加一,再赋值。

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d\n",*++p);//结果是6
	printf("%d\n",*p);//结果是6
	return 0;
}

*++p
对于*++p 先* p自加,取自加后指针指向的内容
指针取到第二个元素,赋值。

#include<stdio.h>
int main()
{
	int a[5] = {2,6,4,8,5};
	int *p = a;
	printf("%d\n",*(++p));//结果是6
	printf("%d\n",*p);//结果是6
	return 0;
}

*(++p)
对于* (++p)先* p自加,取自加后指针指向的内容
指针取到第二个元素,赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值