《重生到现代之从零开始的C语言生活》—— 指针3

数组名的理解

在我们使用&arr[0]的方式拿到了数组第一个元素的地址,但是其实,数组名本来就地址,而且是数组首元素的地址

所以数组名就是数组首元素的地址

但是会有两个例外

  • sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
  • &数组名,这里的数组名表示整个数组,取出的是整个数组的地址

除此之外,任何地方使用数组名,数组名都表示首元素的地址

c 复制代码
int arr[10]={1,2,3,4,5,6,7}

arr+1t跳过的就是4个字节,&arr+1跳过的就是40个字节,因为&arr取地址取的是整个数组的地址

使用指针访问数组

c 复制代码
#include<stdio.h>
int main()
{
    int i = 0;
    int arr[10] = { 1,2,3,4,5,6 };
    int* p = arr;
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (i = 0; i < sz;i++)
    {
        printf("%d", arr[i]);
    }

    return 0;
}

在此代码中,arrp是等价的,那么arr[i]可以访问元素,那么p[i]是否也可以访问数组呢?

c 复制代码
#include<stdio.h>
int main()
{
    int i = 0;
    int arr[10] = { 1,2,3,4,5,6 };
    int* p = arr;
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (i = 0; i < sz; i++)
    {
        printf("%d", p[i]);
    }

    return 0;
}

事实证明p[i]可以替代arr[i]

其实p[i]可以等价为*(p+i)

可以解释为,首元素的地址+偏移量求出元素的地址,然后解引用来访问

一维数组传参的本质

当我们把数组传递过去的时候,传递的是数组名

c 复制代码
void aaa(int arr[])
{
.......
}
int main()
{
......
int arr[]={1,2,3,4,5,6,7,8,9};
aaa(arr);
return 0;
}

这时我们给函数传递的是arr这个数组名,我们知道数组名就是数组首元素的地址,所以本质上数组传参就是数组首元素的地址

既然是地址,那么当然可以用指针变量接收它,所以函数的形参的那一部分当然可以用指针变量代替

二级指针

指针变量也是变量,也有地址,那么指针变量的地址储存在哪里呢?

就是二级指针

c 复制代码
int main()
{
int a = 0;
int * aa = &a;
int ** aaa = &aa;//这就是二级指针
return 0;
}

在式子中,*aaa=&aaaaa里储存的是指针变量aa的地址

指针数组

整型数组就是很多整型存放到数组里,字符数组就是很多字符存放到数组里

以此类推,指针数组就是指针存放到数组里

指针数组的每一个元素都是地址,地址又可以指向一个区域

指针数组模拟二维数组

之前有提到过,指针数组就是把指针存放到数组里,指针又能指向一个区域
那么我们可不可以把数组存放到指针里,然后再把指针存放到指针数组

差不多长这样

c 复制代码
int main()
{
  int arr1[9] = {1,2,3,4,5,6,7,8,9};
  int arr2[9] = {1,2,3,4,5,6,7,8,9};
  int * parr[2]={arr1,arr2};
     return 0 ;
}

parri就是访问parr数组的元素,通过parri找到一维数组后,parrij就是一维数组中的元素,这样,一个二维数组的效果就做好啦


今天的知识讲解完啦,如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!

祝看到这里的人天天开心哦(笔芯)

相关推荐
鱼子星_1 小时前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
脚踏实地皮皮晨1 小时前
003002004_WPF Panel 基类 官方类定义
开发语言·windows·算法·c#·wpf·visual studio
caishenzhibiao1 小时前
市场同步系统 同花顺期货通指标
java·c语言·c#
520拼好饭被践踏1 小时前
JAVA+Agent学习day25
java·开发语言·学习
大黄说说1 小时前
Java 并发大坑:volatile、synchronized、Lock 三者如何选择?
java·开发语言
魏码不凡1 小时前
CURL报错:未找到SSL证书文件问题
开发语言·php·ssl
geovindu1 小时前
go:loghelper
开发语言·后端·golang
say_fall2 小时前
【Linux系统编程】文件操作基础:C标准库、系统调用、fd是什么和fd与FILE*的关系
android·linux·c语言
听雨入夜2 小时前
zero.zhang
开发语言·python
江屿风2 小时前
【C++笔记】【二叉搜索树】流食般投喂
开发语言·数据结构·c++·笔记