news 2026/10/23 1:39:35

【c++】c语言入门到c++使用高手: c语言入门之指针(六)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【c++】c语言入门到c++使用高手: c语言入门之指针(六)

第九章 指针

第六节 数组的指针和指向数组指针的指针变量-3

1. 回顾二维数组和多维数组的概念

  • a[3][4]二维数组

  • a[7][8][9], 三维数组, 排列方式a[0][0][0]…a[0][0][9], a[0][1][0]…最右侧维度变化最快,最左侧变化最慢

  • 多维数组以此类推…

2. 指向多维数组的指针和指针变量的探究

#include<iostream>intmain(){//可以把a看成是一个一维数组,这一个一维数组有三个元素, a[0], a[1], a[2]// 每个元素又是一个包含4个元素的一维数组//数组名a,同样代表数组首地址, 假设a[0]的地址在1000, a[1]的地址是1016, a[2]的地址是1032inta[3][4];int*p;p=(int*)a;//强制类型转换p=(int*)(a+1);// 代表第一行首地址,每行有四个元素,每个元素占4个字节,a+1要跳过16个字节// a[0], a[1], a[2]就是个一维数组名,c语言规定数组名代表数组的首地址//也就是说a[0] == &a[0][0]p=a[0];p=a[1];// 第0行第一列元素首地址p=&a[0][1];//也可以使用p= a[0]+1;return0;}
一些推论(假设数组首地址为1000)
  • a[0] 等价于 *a, 都是数组首地址, 则地址为1000

  • 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[0]+1) 等价于 a[0][1]

  • *(a[1]+2) 等价于 a(*(a+1)+2), 第一行第二列元素值(已哭晕!!)

a[i]的性质
  • 如果是一维数组的话,是代表值,是占用实际内存的

  • 如果是多维数组的话,是代表地址,a[i]和&a[i]的地址值是一样的

代码演示
#include<iostream>intmain(){inta[3][4];inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++){a[i][j]=0;}}int*p;p=(int*)(a+1);//第1行首地址*p=56;p++;*p=88;for(i=0;i<3;i++){for(j=0;j<4;j++){printf("a[%d][%d]: %d ",i,j,a[i][j]);}}return0;}

3. 指针数组和数组指针

a) 指针数组
#include<iostream>intmain(){// 首先这是个数组,数组中有4个元素,每个元素都是个指针,// 所以这相当于定义了4个指针变量// 指针数组int*p[4];//能引用的下标是0-3inta[3][4];inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++){a[i][j]=100;printf("a[%d][%d]: %d ",i,j,a[i][j]);}}printf("\n");p[0]=&a[0][0];p[1]=&a[0][1];p[2]=&a[0][2];p[3]=&a[0][3];for(i=0;i<4;i++){printf("the value of *p[%d]: %d ",i,*(p[i]));}return0;}
b) 数组指针
  • 不太好理解,使用不是很多

  • 实例代码1

#include<iostream>intmain(){// 数组指针,注意括号//这是一个指针变量,用来指向10个元素得的一维数组int(*p)[10];inta[10];for(inti=0;i<10;i++){a[i]=i;}p=&a;//要用取地址符,否则编译报错int*q;q=(int*)p;for(inti=0;i<10;i++){printf(" value: %d",*q);q++;}return0;}
  • 实例代码2
#include<iostream>intmain(){int(*p)[10];inta[3][10];inti,j;for(i=0;i<3;i++){for(intj=0;j<10;++j){a[i][j]=i+j;}}p=a;//二维数组名可以直接赋值给数组指针int*q;q=(int*)p;for(i=0;i<3;i++){for(intj=0;j<10;++j){printf(" value: %d ",*q);q++;}printf("\n***************************\n");p++;}return0;}

4. 多维数组的指针做函数参数

  • 实际应用,建议参考前面的实例
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 1:38:45

【工程与环境】Tensorflow 1.14: Eigen using failed(OpenCV冲突问题)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:38:44

【工程与环境】Ubuntu:环境变量PATH、LIBRARY_PATH和LD_LIBRARY_PATH的区别

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:38:27

【工程与环境】Ubuntu16.04下实时显示GPU使用情况

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:38:09

多人协作AI视频生产:LibTV团队版如何重构工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:37:46

基于BERT的多维度情感分类实战:从数据标注到模型上线全复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 1:36:13

麒麟V11部署OpenStack Zed:kolla-ansible容器化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华