目录

一、指向数组元素的指针变量的定义和赋值

二、通过指针引用数组元素

三、数组名作为函数参数

四、指向多维数组的指针和指针变量探究

五、指针数组和数组指针


一、指向数组元素的指针变量的定义和赋值

数组指针是指数组的开始地址(首地址),数组元素的指针就是数组元素的地址。

a[3]=6;下标法引用数组元素,也可以用指针引用数组元素。

int a[5]={5,6,7,8,9};能引用的是0--4,只要是数组,那么数组元素的内存一定是紧挨着的,从首地址开始以数据类型所占字节进行叠加。

注意:数组名a代表的是数组的首地址,即数组名a等于数组中首元素的地址,a==&a[0]

定义指针变量时也可以给指针变量赋初值:int *p=a或*p=&a[0];

二、通过指针引用数组元素

  1. *p=19;等价于a[0]=19;

  2. p=p+1//增加了4,比如原来p=1000,p+1后p=1004,指针变量内保存的地址加上sizeof(类型)。
  3. p+i 或者 a+i (i是数组元素的小标)
    假如现在p指向数组首地址,a是数组名(代表数组首地址),那么p+i 或者 a+i 就是数组元素a[i]的地址,也就是她们指向了数组a的第i个元素。 相当于,p+3为&a[3]. 结论:p+i 或者 a+i 都是地址,可以赋给指针变量。

  4. *(p+i)或者*(a+i):
    从第3条可得,这两个是p+i a+i所指向的数组元素,也就是a[i],比如说*(p+2)或者*(a+2)就是a[2].

  5. p[i]
    p[i] == *(p+i) == a[i]
    p[3]=19,则a[3]=19.
    引用数组元素有很多方法:a[i];p[i];*(p+i);*(a+i);

  6. *p++:
    优先级相同,并且都是从右到左的结合性,所以等价于*(p++)
    p++为先用后加,所以*(p++)整个作用是:得到p指向的变量的值(*p),然后再使p指针自增,指向下一个数组元素。
    printf("%d\n",*p++);先打印出a[0]的值,然后p指向了a[1]。
  7. *++p:
    相当于*(++p),和第六不同,++p是先加后用,p会先自增1,;然后再去用p值。
    printf("%d\n",*++p);p指向了a[1],打印a[1]的值。
  8. (*p)++:
    表示p所指向的元素加1,如果p指向数组首地址,那就等价于a[0]++;实际上是数组元素值+1,不是指针+1.

三、数组名作为函数参数

如果一个实参的数组,想在函数中改变此数组的元素的值,实参和形参的对应关系有4种:

  1. 实参和形参都是数组名
    a是实参数组首地址,那么ba是形参数组首地址,a和ba共用一段内存,也就是说,再调用changevalue期间,a和ba指的是同一个数组。

  2. 实参用数组名,形参用指针变量

  3. 实参和形参都用指针变量

  4. 实参为指针变量,形参为数组名。

四、指向多维数组的指针和指针变量探究

可以把二维数组名a看成一个一维数组,这个一维数组有三个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组。

  1. a:二维数组名,也是整个二维数组的首地址。 假设第0行的首地址是1000。

    int a[3][4];
    int *p;
    p=(int *)a;//有时将数组名赋给指针变量,系统不答应,那么就用强制转化符。
  2. a+1,a+2 分别代表 第一含首地址和第二行首地址。所以a+1跳过16个字节的,也就是a=1000,a+1=1016,a+2=1032.
  3. 这表示a[0], a[1], a[2]是一维数组名。C语言规定数组名代表数组的首地址,所以有如下:

  4. 第0行第1列元素地址表示方法有:
    &a[0][1] a[0]+1 ----1004
    p=&a[0][1];等价于p=a[0]+1;
  5. 结论:
    a[0]等价于*a,都是地址1000, a==*a,都是地址;
    a[0]+1等价于*a+1,等价于&a[0][1],等价于1004;
    a[1] 等价于*(a+1),等价于1016;
    a[1]+2 ,等价于*(a+1)+2,等价于&a[1][2],等价于1024.注意不要把 *(a+1)+2写成*(a+3),那就变成了a[3];
  6. a[0]+1 等价于 *a+1,等价于&a[0][1] ,等价于 1004,这是个地址。
    *(a[0]+1)就代表 a[0][1] 的值;*(*a+1)也是a[0][1]的值
    也有:*(a[1]+2), a[1][2]的值,*(*(a+1)+2),都表示第1行第2列元素值。

在二维数组中,a[i]和&a[i]地址值是一样的。

实践:

五、指针数组和数组指针

指针数组:

首先这是个数组,数组中有10个元素,每个元素都是个指针,相当于定义了10个指针变量。

int *p1[10];

数组指针:

int (*p)[10];这是一个指针变量,这个指针变量用来指向含有10个元素的一维数组。

第三节 数组的指针和指向数组的指针变量相关推荐

  1. c++17(26)-数组、二维数组的指针、指向数组的指针、指向数组的指针的指针

    #include <iostream> #include <string.h> using namespace std;void setC1(int a[],int size) ...

  2. 深入浅出C语言:(三)C 语言数组指针(指向数组的指针)

    目录 一.C 语言数组指针(指向数组的指针) 二.C 语言字符串指针(指向字符串的指针) 三.C 语言指针数组(数组每个元素都是指针) 四.二维数组指针(指向二维数组的指针) 五.指针数组和二维数组指 ...

  3. 指向数组的指针与指向数组首元素的指针

    我的主力博客:半亩方塘 以下原创内容,转载请注明地址,欢迎对以下内容提供不同参考意见: 指向数组的指针与指向数组首元素的指针究竟有什么区别呢?有人说,这二者不是一回事么?它们就是同一个东西啊!然而,事 ...

  4. 区分指向数组元素的指针、指向数组的指针、指针数组

    区分指向数组元素的指针.指向数组的指针.指针数组 指向数组元素的指针 这类指针比较常见,例如 int a[3] = {1, 2, 3}; int *p; p = a;//将数组的地址(也即数组首元素的 ...

  5. C语言 数组的指针和指向数组的指针变量

    一.回顾二维数组和多维数组的概念 int a[3][4];  //二维数组 int a[2][3]4];  //多维数组 二.指向多维数组的指针和指针变量的探究 可以把a看成是一个一维数组,这个一维数 ...

  6. 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)

    大家都知道,指针有双面性,灵活度高,但是运用时一定要避免野指针和空指针的出现.否则会出现一些意想不到的错误.话不多说,看下面的代码: int main() {int arr[10] = { 0 };/ ...

  7. 二维数组的传参【01_数组指针_指向数组的指针】

    2021-04-08 二维数组的传参[01_数组指针_指向数组的指针] #include <stdio.h> #include <stdint.h> #include < ...

  8. 字符串的指针和指向字符串的指针变量

      引自:http://s319.dlut.edu.cn/educ/83.htm §8.4 字符串的指针和指向字符串的指针变量 8.4.1 字符串的表现形式 在C程序中,可以用两种方法实现一个字符串. ...

  9. [C++基础]018_常量指针和指向常量的指针

    先来看一下什么是常量指针,什么是指向常量的指针吧! 1. 常量指针定义 1 int * const ptr = new int(); 2. 指向常量的指针 1 const int* ptr; 上面已经 ...

  10. 辨析 const指针 和 指向常量的指针

    辨析以下几种指针p的定义. int tmp = 5;int *p = &tmp; const int *p = &tmp; int const* p = &tmp; int * ...

最新文章

  1. DFiddler:A HTTP Packets Listener一个简易版的手机端的Fiddler。
  2. unable to execute dex:GC overhead limit exceeded unable to execute dex:java heap space 解决方案
  3. linux的ping工具,用linux下的tcping工具测试已禁ping服务器延迟
  4. 两段关于统计日期的sql语句
  5. 深度学习“炼丹”难?三分钟带你了解国产丹炉旷视天元
  6. Linux install innotop
  7. 轻松逃脱某防火墙对ss的探测
  8. 智慧林业整体解决方案_智慧农贸市场整体解决方案——前期调研篇
  9. Excel多表头导出(.net)
  10. P3089 [USACO13NOV]POGO的牛Pogo-Cow
  11. Windows workflow foundation之旅(三)——指南2(创建状态机工作流)(上)
  12. 闲话WPF之二十(WPF中的传递事件 [2] )
  13. FPGA学习记录(7)<巴特沃斯低通IIR滤波器FPGA实现>
  14. [Matlab]使用textscan读取.csv文件时候只读取到了第一行
  15. 历代iPhone主要参数对比,更新于2022年03月
  16. Java实现八皇后算法
  17. 社区人物志|缪翎:见证开源世界的女性力量
  18. opencv的逻辑运算bitwise详解
  19. 如何做到四位验证码更简洁的生成?
  20. 信息隐藏技术综述——粗浅入门

热门文章

  1. Turtle 绘图测试
  2. WIN10+ubuntu14双系统,ubuntu搜索不到wifi
  3. 电商API大全、1688、淘宝天猫APP端商品详情接口调用展示
  4. python如何自动缩进_python word 自动排版写码时应该缩进使用 tab 还是空格?
  5. 查询1997年出生的学生mysql_Mysql学习三
  6. Java使用FFmpeg处理视频文件的方法教程
  7. 何种情况会被列为失信被执行人?
  8. wepy插件wepy-plugin-ugliyjs、wepy-plugin-imagemin
  9. 《自然语言处理实战入门》---- 文本样本扩展小技巧:使用回译技术进行样本增强
  10. IPv6有什么优势?