《重生到现代之从零开始的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 ;
}

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


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

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

相关推荐
我不会编程5557 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄7 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
无名之逆8 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
似水এ᭄往昔8 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙8 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
xixixin_8 小时前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript
W_chuanqi8 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
anlogic9 小时前
Java基础 4.3
java·开发语言
蒙奇D索大9 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西9 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea