首先,大家先需知道一个关于基类型的概念

基类型:组成一个新类型的基础类型

这句话是什么意思呢?举个例子:

int a[3] = {1,2,3};

上面是由三个int类型的数组成一个新的类型也就是数组,所以基类型是int

int a[2][2] = {{1,2},{3,4}};

上面是由两个一维数组类型组成一个二维数组,所以基类型是一维数组

有了上面两个例子,相信大家能知道基类型是啥意思。

接下来先说说一维数组和一级指针关系

首先指针说白了就是存放地址,把变量地址赋予指针

取出该变量的数值应该用*号取出指针所指变量地址里面的值,如下

如果我们想把一个数组的地址赋值给指针,如下

程序里的a表达的是数组的首地址,则我们可以得到int *p = a的关系

如果我们想输出数组第二个元素的地址呢,是不是得把指向首地址的指针移到数组第二个数的地址

指针p存储首地址,也就是指向数组的第一个元素,+1后相当于指向数组第二个元素,指针往右移动1个基类型,也就是一个int型长度,所以地址与首地址相差4个字节,因为int数据类型长度为4个字节。

我们用 * 号取后数值为1,说明正是指向数组第二个元素。

突发奇想,指针 p = a,那我可以把p改作a执行上面操作吗?

想法被确定了,在某种情况下,数组的确和指针用法一样。

接下来是二维数组和数组指针关系

数组指针:本质是个指针, 指向 数组的指针

有人可能会问,那可以指向一维数组吗,先不说,看到下面应该就能理解

可以看出,p存放二维数组首地址,如果我们想要到a[1][0]的地址呢

指针p存储首地址,上面我们已经说过二维数组由一维数组构成,基类型为一维数组,+1后相当于指向二维数组第二个元素也就是第二个一维数组,指针往右移动1个基类型,也就是一个一维数组型长度(包含两个int型),所以地址与首地址相差8个字节。

如果想要a[1][0]的数值呢

有人可能会被不知道为什么需要两个 * 号才能取出数值

这是因为我们一开始时p+1只是指针移动一个基类型,也就是移到二维数组的第二个一维数组一整个中,可是别忘记他的元素是一维数组,没有*之前我们还只是在二维数组中,我们 *{p+1}才是进入一维数组里面,然后接下来就和一级指针一样的操作,再多个*就可以把数值取出:*(*(p+1))

如果要取a[1][1]的地址和值呢

为什么在第一个 * 号后+1呢

因为当我们*(p+1)进入二维数组中第二个一维数组里面后,我们如果想取它一维数组第二个元素的int值,是不是和上面一维数组和一级指针一样,+1就可移动到第二个int,这里(*p+1)+1后面+1移动的是int的基类型,前面的+1移动的是一维数组的基类型,则取出a[1][1] 则需要(*(*p+1)+1) 。

看到这里希望大家明白为什么前面说的数组指针不能指向一维数组以及二维数组和数组指针关系

总结:一维数组和一级指针:

  int a[5];

  int *p = a;

二维数组和数组指针的关系:

 int a[2][2];

 int (*p)[2];    注意数组指针和二维数组后面的[2]必须相同。

C语言学习笔记之数组与指针的关系的更多相关文章

  1. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  2. C语言学习笔记 (004) - 数组名和数组首地址(转)

    一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...

  3. c语言学习笔记(9)——指针

    指针是c语言的灵魂 ----------------------------------------------------------------------------- # include &l ...

  4. C++ Primer 学习笔记_Chapter4 数组和指针–指针

    一.什么是指针? 指针与迭代器一样,指针提供对其所指对象的间接访问,指针保存的是另一个对象的地址: string s("hello"); string *ps = &s; ...

  5. c语言学习笔记 函数数组传递笔记

    今天学习c语言的一个小例子,果然还是陷入了php的编程习惯里,这里记录一下. #include <stdio.h> //例子很简单,就是编写一个函数把传递进来的数组里的值都赋值为1而已 / ...

  6. Go语言学习笔记(4)——数组和切片

    1 数组的特点: 长度固定.元素数据类型相同.下标从0开始 1.1 声明和初始化: var array_name [size] type         var arr1 [10] float32   ...

  7. 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘

    #深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...

  8. 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

    "指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...

  9. 大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?

    静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放:静态内存是在栈中分配的: 动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误 ...

随机推荐

  1. msyql事务的四种隔离级别

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  2. Scala 面向对象(二):package 包 (一) 入门

    1 Scala包的基本介绍 和Java一样,Scala中管理项目可以使用包,但Scala中的包的功能更加强大,使用也相对复杂些,下面我们学习Scala包的使用和注意事项. 2 Scala包快速入门 使 ...

  3. 05-Python模块

    一.简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被其他程序导入来使用模块具有的功能.这也是使用python标准库的方式. import time start_time ...

  4. Java数据类型自动转换(++ ,+=)

    在算术表达式中的自动类型转换 数据从类型范围小的自动向数据范围大的转换 整数向浮点数转换(包括long类型向float转换) 例子: char类型的范围内与整数之间转换依据ASCII表 强制转换会丢失 ...

  5. 【Maven】总结

    导言:生产环境下开发不再是一个项目一个工程,而是每一个模块创建一个工程,而多个模块整合在一起就需要 使用到像 Maven 这样的构建工具. 1 Why? 1.1 真的需要吗? Maven 是干什么用的 ...

  6. bzoj3043IncDec Sequence*

    bzoj3043IncDec Sequence 题意: n个数,每次可以将区间l到r里的数+1或-1,问将它们变成同个数的最小操作次数和保证最小操作次数前提下有多少中可能.n≤100000. 题解: ...

  7. sanri-tools-maven 企业软件开发工具集

    9420 开发工具包 sanri-tools-maven 是一个开源的用于企业开发的工具包,重点想解决项目开发中一些比较麻烦的问题 根据表和模板生成相应代码:一些身份证,企业代码,车架号的验证与生成: ...

  8. Nginx日志按天切割基本配置说明

    1.声明日志格式 声明log    log位置                log格式; access_log logs/access.log main; 2.定义日志格式(以下为常用的日志格式 可 ...

  9. MySQL主从复制--单库复制搭建

    背景说明 负责公司MySQL数仓的搭建和维护,因为前端业务涉及到一次业务表的分库,导致整个平台新增加一台MySQL服务器,需要将该库数据通过主从复制同步至原有的数仓实例. 数据流向说明如下图: 业务环 ...

  10. Python Ethical Hacking - Malware Analysis(2)

    Filtering Command Output using Regex #!/usr/bin/env python import smtplib import subprocess import r ...