《重生到现代之从零开始的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]就是一维数组中的元素,这样,一个二维数组的效果就做好啦


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

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

相关推荐
涛ing29 分钟前
32. C 语言 安全函数( _s 尾缀)
linux·c语言·c++·vscode·算法·安全·vim
xrgs_shz1 小时前
MATLAB的数据类型和各类数据类型转化示例
开发语言·数据结构·matlab
厂太_STAB_丝针3 小时前
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
c语言·单片机·嵌入式硬件
charlie1145141914 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
来恩10034 小时前
C# 类与对象详解
开发语言·c#
*TQK*4 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
komo莫莫da5 小时前
寒假刷题Day19
java·开发语言
ElseWhereR5 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
*TQK*5 小时前
ZZNUOJ(C/C++)基础练习1031——1040(详解版)
c语言·c++·编程知识点