24.数组名字取地址变成数组指针,数组名和指针变量的区别

文章详细阐述了一维数组和二维数组在取地址后作为指针的行为,说明了数组名实际上是一个常量指针,加1操作在不同维度数组中的含义。同时对比了数组名和指针变量的相同点(如都指向首元素地址)和不同点(如数组名不可赋值,对二者取地址结果不同)。
摘要由CSDN通过智能技术生成

数组名字取地址变成数组指针

1.一维数组名字取地址,变成一维数组指针,加1跳一个一维数组。

int a[10];
a+1 跳一个整型元素,是a[1]的地址
a和a+1相差一个元素,4个字节

&a 就变成了一个一位数组指针,是int(*p)[10]类型的。
(&a)+1 和 &a 相差一个数组即10个元素40个字节。

int main()
{
	int a[10];
	printf("a=%p\n", a);
	printf("a+1=%p\n", a + 1);

	printf("&a=%p\n", &a);
	printf("&a+1=%p\n", &a + 1);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

2.二维数组

int a[4][5];
a+1跳5个整型
(&a)+1跳4行5列(80个字节)

#include<stdio.h>
int main()
{
	int a[4][5];
	printf("a=%p\n", a);//int* p[5]
	printf("a+1=%p\n", a + 1);

	printf("&a=%p\n", &a); //int(*p)[4][5]
	printf("&a+1=%p\n", &a + 1);
	return 0;
}

在这里插入图片描述

数组名字和指针变量的区别

int a[5];
int* p;
p=a;

1.相同点:
  • a是数组的名字,是a[0]的地址,p=a即p保存了a[0]的地址,即a和p都指向a[0],所以在引用数组元素的时候,a和p等价。
  • 引用数组元素回顾: a[2] , *(a+2) , p[2] , *(p+2)都是对数组a中a[2]元素的引用。
#include<stdio.h>
int main()
{
	int a[5] = { 0,1,2,3,4, };
	int* p;
	p = a;
	printf("p=%p\n", p);
	printf("a=%p\n", a);

	printf("a[2]=%d\n",a[2]);
	printf("*(a+2)=%d\n", *(a + 2));
	printf("p[2]=%d\n", p[2]);
	printf("*(p+2)=%d\n", *(p + 2));
	return 0;
}

在这里插入图片描述

2.不同点
  • a是常量,p是变量
  • 可以用等号’='给p赋值,但是不能用等号给a赋值
  • 对a取地址和对p取地址结果不同。
  • 因为a是数组的名字,所以对a取地址结果为数组指针。
  • p是个指针变量,对p取地址(&p)结果为指针的指针。
    例如:
    int a[5]={0,1,2,3,4};
    int *p=a;
    假如 a[5]的地址为0x00002000,p的地址为0x00003000
    在这里插入图片描述
#include<stdio.h>
int main()
{
	int a[5] = { 0,1,2,3,4 };
	int* p;
	p = a;
	printf("a=%p\n", a);
	printf("&a=%p\n", &a);
	printf("&a+1=%p\n", &a + 1);

	printf("&p=%p\n", &p);
	printf("&p+1=%p\n", &p + 1);
	return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oo0day

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

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

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

打赏作者

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

抵扣说明:

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

余额充值