20.【C/C++ 指针数组和数组指针 (超详版)】
指针数组和数组指针(指针重点)
- (一)、指针数组
- 1. 什么是指针数组:
- 2.指针数组的格式:
- 3.指针数组的作用:
- 4.指针数组与一维数组的关系:
- 补充:::::::::::::::::::
- 5.指针数组与二维数组的关系
- 6.指针数组申请动态二维数组
- 指针数组申请动态二维数组格式:
- 6.实战项目:
- 代码展示:
- 效果展示:
- 7.小结
- 7.1指针数组名加1,移动多少字节?
- 7.2指针数组名相当于什么样的指针?
- (二)、数组指针:
- 1.什么是数组指针
- 2.数组指针的格式:
- 3.数组指针的作用:
- 4.数组指针与二维数组的关系:
- 补充:::::::::::::::::::
- 多数组有关概念
- 4.实战项目:
- 代码展示:
- 效果展示:
- (三)、数组指针和指针数组
(一)、指针数组
1. 什么是指针数组:
在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
2.指针数组的格式:
数据类型 *首地址[];
3.指针数组的作用:
指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活。
4.指针数组与一维数组的关系:
指针数组每个元素都是指针,一维数组的地址可以赋值给指针。然后进行操作.
#include<iostream>
using namespace std;
int main()
{int* p[3]; //定义一个指针数组int a[] = { 3,6,1,9,10 }; //定义一个整型数组p[0] = a; //p[0]是一个类型为int* 指向int的指针,a是一个int*,指向int p[1] = a + 1;p[2] = a + 3;cout << (*p[0]) << " " << (*p[1]) << " " << (*p[2]) << endl; //[]优先级比()高,所以()没起到作用cout << a[0] << " " << a[1] << " " << a[3] << endl;int* q; //普通指针q = a + 1;cout << *q;
}
补充:::::::::::::::::::
如果是 二维数组a[0]+1;代表a[0][1]; 这时候a[0]是行数组名它代表这一行的首地址就是a[0][0],+1就等于加它类型的字节数1x字节数,(+2就是2x字数)结果就是a[0][1];如果是一维的话,更简单;+1就等于加它类型的字节数x1;结果是a[1];
5.指针数组与二维数组的关系
#include<iostream>
using namespace std;
int main()
{int* p[3]; //定义一个指针数组int a[2][3] = {{3,6,1} ,{12,9,10}}; //定义一个二维整型数组p[0] = a[0]; //a[0]=&a[0][0]p[1] = a[1]; // a[1]=&a[1][0]cout << a[0][1] << endl; //输出a[0][1]cout << *(a[0] + 1) << endl; //输出a[0][1],(a[0]+1)这样代表地址cout << *(p[0] + 1) << endl; //输出a[0][1],指针+1代表移动一个数(列)cout << *(p[0] + 2) << endl; //输出a[0][2],指针+1代表移动一个数(列)return 0;
}
接下来让我们练习一道题:(二维数组全部元素求和)
#include<iostream>
using namespace std;
int main()
{int sum=0;int* p[3]; //定义一个指针数组int a[2][3] = {{3,6,1} ,{12,9,10}}; //定义一个二维整型数组p[0] = a[0]; //a[0]=&a[0][0]p[1] = a[1]; // a[1]=&a[1][0]for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){sum += *(p[i] + j);//或者 *(*(p+i)+j) 或者 p[i][j]}}cout << "求和后得:" << sum << endl;return 0;
}
6.指针数组申请动态二维数组
指针数组申请动态二维数组格式:
【方法1基本格式】
int **p; //指针类型是int** 型,指向int*型的指针变量
p=new int*[列]
for(int i=0;i<列;i++)
{p[i]=new int [列]
}
6.实战项目:
代码展示:
1.错误示范:
【指针指向二维数组不能用*p=a[0]】
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{int a[2][2] = {1,2,3,4};int* p;*p = a[0];for (int i = 0; i < 4; i++){cout << setw(2) << *(p+i) ;}return 0;
}
2.指针数组申请动态二维数组
#include <iostream>
using namespace std;
int main()
{int m, n;cout << "请输入行数为:" << endl;cin >> m;cout << "请输入列数:" << endl;cin >> n;int**p; // p = new int*[n];for (int i = 0; i < n; i++){p[i] = new int[n]; //左边行,右边列}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> p[i][j];}}cout << "输出为:" << endl;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cout<< p[i][j]<<" ";}}delete[]p;return 0;
}
效果展示:
1.错误示范效果展示:
2.申请动态二维数组正确效果
7.小结
7.1指针数组名加1,移动多少字节?
*(p+1):走了一行; * (p+1)+1走了一列
7.2指针数组名相当于什么样的指针?
指针数组名就是元素地址相当于一级指针取地址就是二级指针,故指针数组名相当于二级指针“数据类型 * p” 本身就是一个指针,而它的数据类型是int * 也是一个指针,故称为二级指针。
(二)、数组指针:
1.什么是数组指针
数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。
2.数组指针的格式:
数据类型(*p)[];
3.数组指针的作用:
数组指针是指向数组地址的指针,其本质为指针;
4.数组指针与二维数组的关系:
#include<iostream>
using namespace std;
int main()
{int(* p)[3]; //定义一个数组指针int a[2][3] = {{3,6,1} ,{12,9,10}}; //定义一个二维整型数组return 0;
}
这里a是个二维数组的数组名,相当于一个二级指针常量;//二维数组名与二级指针毫无关系(初学者常常混淆)。
p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;
补充:::::::::::::::::::
p+i是一维数组a[i]的地址,即p+i==&a[i];对该式两边作取内容运算()得(p+i)a[i],由于二维数组中a[i]&a[i][0], 则 * (p+i)表示a[i][0]的地址,即 * (p+i)==&a[i][0](p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),(*(p+2)+3)表示a[2][3]的值。
多数组有关概念
注意a[0],a[1],a[2]表示的都是对应那行的数组首地址,和数组名,而不是一个元素,(这里得到*号不是指针,而是取地址)!!!!!!!!!!!
多维数组地址的表示方法
设有整型二维数组a[3][4]如下:
1000 1001 1002 1003
1004 1005 1006 1007
1008 1009 1010 1011
设数组a的首地址为1000,各下标变量的首地址及其值。C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。 每一个一维数组又含有四个元素。例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。数组及数组元素的地址表示如下: a是二维数组名,也是二维数组0行的首地址,等于1000。a[0]是第一个一维数组的数组名和首地址,因此也为1000。(a+0)或a是与a[0]等效的,它表示一维数组a[0]0号元素的首地址。也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0] ,*(a+0), * a,&a[0][0]是相等的。同理,a+1是二维数组1行的首地址,等于1004。a[1]是第二个一维数组的数组名和首地址,因此也为1004。&a[1][0]是二维数组a的1行0列元素地址,也是1004。因此a+1,a[1],* (a+1),&a[1][0]是等同的。由此可得出:a+i,a[i], * (a+i),&a[i][0]是等同的。此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。
C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i], * (a+i)和a+i也都是等同的。另外,a[0]也可以看成是a[0]+0是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。
由a[i]= * (a+i)得a[i]+j= * ( a+i)+j,由于 * (a+i)+j是二维数组a的i行j列元素的首地址,该元素的值等于 * ( * (a+i)+j)。
4.实战项目:
代码展示:
1.数组指针和二维数组的联用
#include<iostream>
using namespace std;
int main()
{int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int(*p)[4]; p = (int(*)[4])a; //目的是为了把a看作参数for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++) printf("%d ", p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)printf("\n");}
}
2.数组指针创建动态二维数组
#include <iostream>
using namespace std;
int main()
{int m, n;cout << "请输入行数为:" << endl;cin >> m;int(*p)[3]; p = new int[m][3]; //列数是实参,否则报错哦for (int i = 0; i < m; i++){for (int j = 0; j < 3; j++){cout << "请输入p[" << i << "][" << j << "]的值" << endl;cin >> p[i][j];}}cout << "输出为:" << endl;for (int i = 0; i < 5; i++){for (int j = 0; j < 3; j++){cout<< p[i][j]<<" ";}}return 0;
}
效果展示:
1.数组指针和二维数组联用
2.数组指针和动态二维数组
(三)、数组指针和指针数组
祝君更上一层楼!!!!!!
20.【C/C++ 指针数组和数组指针 (超详版)】相关推荐
- Go 学习笔记(13)— 指针定义、指针特点、空指针、指针数组、指向指针的指针、指针作为函数入参
1. 复合数据类型 Go 语言基本的复合数据类型有指针.数组.切片.字典.通道.结构和接口等.格式如下: * pointerType // 指针类型, [n]elementType // 数组类型, ...
- C指针4:数组指针(指向数组的指针)
先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...
- 结构体内指针数组调用_指针的这些技巧你都掌握了吗
点击上方蓝字"杜明c"一起玩耍 摘要 为什么需要用指针? 一些概念 数组指针 指针数组 指针数组和数组指针在内存中的关系 函数指针 函数指针例子 指针作为参数的传递 通过函数修改指 ...
- 指针数组,数组指针,指针函数,函数指针,二级指针详解
先看个简单的:char *p,这定义了一个指针,指针指向的数据类型是字符型,char *(p)定义了一个指针P: char *p[4], 为指针数组,由于[]的优先级高于*,所以p先和[]结合,p[ ...
- 对C语言 结构数组 指向结构变量的指针 指向结构数组的指针
一.结构数组的定义 数组的元素可以是结构类型的.结构数组的每一个元素都是具有相同的结构类型的下标结构变量.在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体. 如:一个班的学生的档案,一个车 ...
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言内存管理-字符数组与字符指针
堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈. 2.堆区(h ...
- 关于一维数组和二位数组的数组指针
1. 一维数组 c语言中, 数组占用的空间是一组连续的物理内存空间. 所以对于1维数组来讲,只需要知道数组头1个元素的地址, 就可以逐个地得出各个元素的值了. 例子: ...
- c++学习笔记之指向对象的指针以及对象数组
用对象数组的方法对数据成员进行初始化. #include<iostream> using namespace std; class box {public:box(int h=10,int ...
最新文章
- 存储能否导致ESXi网络性能问题?
- 参与2011年7月13日举行的Azure国际猜拳锦标赛,赢取5,000美元大奖
- django-2 模板文件的加载
- [洛谷3811]【模板】乘法逆元
- 监控Linux服务器网站状态的SHELL脚本
- id3与软件测试,ID3算法的实现
- BootStrap笔记-文字排版
- c语言数组的概念和指针的加减使用
- linux网络子系统分析(一)——协议栈分层实现综述
- 计算机的音量打不开,电脑的音量控制打不开怎么办
- 安装VMware出现Error 1406:could not write value installpath to key的解决办法
- 阿里巴巴实习生笔试研发工程师
- 滚动交互引导界面的Ouroboros
- matlab数字图像处理——图像的读写,灰度、二值图像
- 【刘文彬】 Debug EOS:nodeos + mongo_db_plugin
- 史上最全的用Python操控手机APP攻略!建议收藏!
- scaffold-dbcontext 命令使用说明
- TCP断开连接时的2MSL的time_wait状态
- HTTP 笔记 发展历程 缓存
- LFWA+ 人脸属性数据集下载地址 【Google Drive】