C语言指针和数组的关系

指针与数组的关系和区别

前言

什么??你还分不清指针和数组有什么关系?那快来看看这篇博客吧,相信你读完以后一定会有所收获!

预备知识

&表示取地址,也就是把地址取出来给你

*表示解引用,也就是根据地址追根溯源去找对应的那个元素

本质关系

指针的本质

指针的本质是一种变量,什么变量呢?它是一个存放内存地址的变量,也就是说指针代表的就是一个地址。但是我们注意,既然我们说它是一个变量,说明指针的值是可以被改变的!这就是它很重要的一点。

数组的本质

那么数组又是什么呢?数组它是一种数据类型。也就是说,你把一堆数放到一块,它们就构成了一组数,也就是一个数组。数组是一堆元素的集合,在内存中也是有属于自己的地址的。它和普通的数据不同的在于,它的数据是连续储存的,也就是说每一个元素的地址都是连续着的(也就是它们被放到一块了)。

因为数组中的元素的地址是连续的,所以我们用数组名来代表数组的首地址

换言之,arr[10]是一个长度为10的数组,我们就可以用arr来表示这个数组的首地址。

我们来看个例子

int a[5];
for(int i=0;i<5;i++)
{
    scanf("%d",a+i)//看到了吗,这里就是应用了用数组名代表首地址,那么
}

看到了吗,这里就是应用了用数组名代表首地址,那么a就表示a[0]的地址,a+i就表示a[i]的地址,至于为什么是a+i下文解释

当指针和数组放到一起

指针是一个存放内存地址的变量,而数组名可以代表首地址,当两者放到一起,也许。。。。。。

先来看一个例子

int arr[10]={0}//对数组初始化
int* pa=arr;

这里第二行就让指针赋值为arr数组的首地址,那么从现在pa和arr就是相同的了(两种情况除外)

arr[i]和pa[i]是一样的

arr+i和pa+i是一样的

唯一不同的是,arr是指针常量,不可以被改变;而pa是指针变量,可以实现赋值和加减操作!

填坑环节

1.为什么是a+i呢

a+i并不是单纯的地址+1,而是a加上了sizeof(a的类型)*1,变成了a[i]的地址,从而实现了对a[i]的访问。

2.哪两种情况除外呢

第一种:sizeof(数组名)和sizeof(指针变量名)是不一样的

前者表示的是整个数组的大小,后者表示的是指针的类型大小

第二种:&数组名 和 &指针变量名是不一样的

一方面,数组名是指向首个元素的指针&数组名整个数组的指针。在指针加减整数的时候,前者以一个元素为单位,后者以整个数组为单位。

另一方面,&指针变量名是储存指针变量的地址(类似于碟中谍?)

总结

初始化指针等于数组名以后,指针和数组是等价的,但是两种情况例外

第一种:sizeof(数组名)和sizeof(指针变量名)是不一样的

前者表示的是整个数组的大小,后者表示的是指针的类型大小

第二种:&数组名 和 &指针变量名是不一样的

&数组名是整个数组的指针,&指针变量名是储存指针变量的地址

你可能感兴趣的:(学习经历,c语言,数据结构,算法)