C/C++中的指针数组和数组指针
1. 指针数组
定义:int *p[n],由于[]的优先级高于*,p和[]结合成一个数组,该数组的元素存储的是int类型的指针,由于数组内容是指针,因此p+1的步长是sizeof(int*),在32位机器上,步长通常是4个字节;
int a[3][4];
int *p[3]; // 指针数组,具有3个类型为(int*)的元素;
p[0] = a[0]; // 将第一个元素的值赋值为a[0];
p[1] = a[1]; // 将第二个元素的值赋值为a[1];
p[2] = a[2]; // 将第三个元素的值赋值为a
2. 数组指针:
定义:int (*p)[n],由于()的优先级高于[],p和()结合成一个指针,指向一个具有n个int类型元素的数组,由于指针指向的是一个数组,p+1的步长是sizeof(int)*n,因此数组指针又可以称为行指针,在2维数组中,其步长是一行元素的总长度;
int a[3][4];
int (*p)[4] = a; // 数组指针,指向一个具有4个元素的一维数组,现在p的指向的地址和a的首地址一样;
p++; // 步长为sizeof(int) * 4,指向二维数组的下一行的地址,即&a[1];
例子:
int a[][] = {
{ , , },
{ , , },
{ , , }
};
int b[] = { , , , }; int (*pa)[] = a;
int (*pb)[] = &b;
int *pc = b;
int *pd[];
pd[] = a[];
pd[] = a[];
pd[] = b;
int **pe = (int**)(new char[sizeof(int*) * ]);
pe[] = a[];
pe[] = a[];
*(pe + ) = a[];
打印:
printf("pa %p %p \n", *pa, *(pa + ));
printf("pa %d %d %d \n", **pa, **(pa + ), *(*(pa + ) + ));
printf("pb %p %p \n", *pb, *(pb + ));
printf("pb %d %d \n", **pb, **(pb + ));
printf("pc %p %p \n", pc, pc + );
printf("pc %d %d \n", *pc, *(pc + ));
printf("pd %p %p %p %p \n", pd[], pd[], *(pd + ), *(pd + ) + );
printf("pd %d %d %d %d \n", *pd[], *(pd[] + ), **(pd + ), *(*(pd + ) + ));
printf("pe %p %p %p \n", pe[], pe[], *(pe + ));
printf("pe %d %d %d \n", *pe[], *(pe[] + ), *(*(pe + ) + )); pa 0x7fff5fbff7e0 0x7fff5fbff7ec
pa
pb 0x7fff5fbff7d0 0x7fff5fbff7e0
pb
pc 0x7fff5fbff7d0 0x7fff5fbff7d4
pc
pd 0x7fff5fbff7e0 0x7fff5fbff7ec 0x7fff5fbff7d0 0x7fff5fbff7d4
pd
pe 0x7fff5fbff7e0 0x7fff5fbff7ec 0x7fff5fbff7f8
pe
C/C++中的指针数组和数组指针的更多相关文章
- C/C++中数组转换成指针的情况
数组转换成指针:在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针.比如: int ia[10]; int *p = ia; //ia转换成指向数组首元素的指针 以下情况上述转换不会发生: ...
- PHP中使用数组指针函数操作数组示例
数组的内部指针是数组内部的组织机制,指向一个数组中的某个元素.默认是指向数组中第一个元素通过移动或改变指针的位置,可以访问数组中的任意元素.对于数组指针的控制PHP提供了以下几个内建函数可以利用. ★ ...
- C语言中字符数组和字符串指针分析
这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这 ...
- 对于C语言中数组名是指针的理解
我们都知道,c语言中数组名是一个指针,比如下面这段代码 #include<iostream>using namespace std;int main(){ int a[4]={1,2,3, ...
- C语言中的声明解析规则——数组,指针与函数
摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...
- OpenCV二维Mat数组(二级指针)在CUDA中的使用
CUDA用于并行计算非常方便,但是GPU与CPU之间的交互,比如传递参数等相对麻烦一些.在写CUDA核函数的时候形参往往会有很多个,动辄达到10-20个,如果能够在CPU中提前把数据组织好,比如使用二 ...
- C语言中数组变量和指针变量
指针变量为什么需要类型? 数组变量和指针变量在使用sizeof时不同,sizeof(数组变量)是数组长度,sizeof(指针变量)是存储int的字节长度4或者8(64bit). 数组变量在参数传递中, ...
- 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法
引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int main( ...
- c语言中数组,指针数组,数组指针,二维数组指针
1.数组和指针 ] = {,,,,};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0 ...
随机推荐
- 利用ftp端口设置,浅谈windows防火墙之应用+ftp直接资源管理器登陆
win服务器的版本是不错的.防火墙也比较能用.server-u 6.4则是比较稳定.兼容性好的的版本,所以很多人在用 1.服务器为了安全,一般开启windows高级防火墙,在网络连接处右键鼠标,有弹出 ...
- Java Web项目 配置 ueditor心得
近期的JAVA项目,由于客户要求需要引入富文本编辑器. 参考了两款插件,一款是ckeditor,一款是ueditor. ckeditor在上传文件的时候必须配合ckfinder使用,而ckfinder ...
- 简单的线性分类——MATLAB,python3实现
看李政轩老师讲的Kernel,讲的非常好!前面有几道作业题,用MATLAB简单做了下,不知道对不对,错误之处还请指出. 题目是这样的. 一.MATLAB版本: clear; clc % 生成train ...
- linux命令:find
1.命令介绍: find用来在整个系统指定的路径下搜索文件,功能强大,但是遍历整个系统时很耗时间. 2.命令格式: find 路径 [选项] [print -exec -ok...] 3.命令参数: ...
- c语言求平面上2个坐标点的直线距离、求俩坐标直线距离作为半径的圆的面积、递归、菲波那次数列、explode
#include <stdio.h> #include <math.h> #include <string.h> char explode( char * str ...
- unity中全屏背景图缩放
using UnityEngine; using System.Collections; public class BgPicScript : MonoBehaviour { // Use this ...
- Linux TC基于CBQ队列的流量管理范例
参考了TC的很多文档,自己也整理了一篇配置记录.在实际使用过程中效果还不错,在此分享给大家以备参考.环境:局域网规模不是很大40多台机器. NAT共享上网(内网:eth0 外网:eth2)CBQ是通过 ...
- pyhton 27 pip命令无法使用 没有Scripts文件夹 的解决方法
1 安装了setuptools http://jingyan.baidu.com/article/fb48e8be52f3166e622e1400.html 2 用ez_setup.py安装了setu ...
- LintCode Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. Given: 1 / \ 2 3 / \ 4 5 re ...
- YMMI001-采购单审批
************************************************************************ Report : YMMI1 ** Applicati ...