//声明:
1.&----取地址运算符
eg: int m = 1;
int *p = &m;//(*p) == m的地址 == &m;
2.*----间接访问运算符
eg: int n = 2;
int *q = n;//(*p) == n
 
/*
Date:2017-05-23
Author:Johnny Zen

数组指针与指针数组 
*/ 
 
/*
数组指针(也称行指针)
定义 int (*p)[n];
地址表示:    p[j]        p+j 
值引用表示:  (*p)[j]  
本质:数组指针只是一个指针变量 
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,
这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
*/
#include<iostream>
#include<stdlib.h>
using namespace std; #define n 2
#define m 3 int main(){
int array[n][m] = {1,2,3,4,5,6};
int (*p)[m] = array;//行指针;p可指向二维数组a的某一行(所以:p数组长度与要与二维数组的列长度一致)
for(int i = 0; i < n;i++){
for(int j = 0; j < m; j++){
// printf(" [array[i][j]:%d\tp[i][j]:%d]\t ",array[i][j],p[i][j]);
printf(" [array[i][j]:%d\tp[i][j]:%d]\t ",array[i][j],*(p[i]+j));//二者等效 ;注意:p[i]+j:将指向p[i][j]的地址
}
printf("\n");
}
return 0;
} //output:
/*
[array[i][j]:1 p[i][j]:1] [array[i][j]:2 p[i][j]:2] [array[i][j]:3 p[i][j]:3]
[array[i][j]:4 p[i][j]:4] [array[i][j]:5 p[i][j]:5] [array[i][j]:6 p[i][j]:6]
*/
 
 
/*
指针数组
定义 int *p[n];
地址表示: p[i]
值引用表示:*(p[i]+j)   *p[i]
本质:指针数组是多个指针变量
表示:数组a中的元素都为int型指针  素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于* 
 
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
*/
void PointArray(){
  const int n = 3;
  const int m = 4; 
  int *p[3]; //[]优先级高 
  int a[n][m];
  for(int i = 0;i<n;i++){
    for(int j=0;j<m;j++){
      a[i][j] = rand();
      cout<<a[i][j]<<'\t';
    }
  cout<<endl;
  } 
  //p[i]   //显示第i行首元素的地址 
  //*p[i]  //显示第i行第1个元素的数值
  //*(p[i]+2) //显示第i行第3个元素的数值
 
  for(int i=0;i<3;i++){
    p[i]=a[i];
    cout<<p[i]<<'\t';
    cout<<*(p[i]+1)<<'\t';
  }
}
 
int main(){
  // ArrayPoint();   //数组指针 
  PointArray();   //指针数组 
  return 0;
 
/*
小结:
         数组指针            指针数组 
  定义     int (*p)[n]                     int *p[n]
  地址表示       p[j] or p+j                     p[i]
  值引用表示    (*p)[j] (先指针引用,再定位)     *(p[i]+j)  or  *p[i] (先定位,再引用值
*/

[C++]数组指针与指针数组的更多相关文章

  1. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  2. C和指针 第八章 数组

    8.1 数组名和指针 int a; int b[10]; a称为一个标量,表示一个单一的值,变量的类型是整数. b是数组,b[1]的类型是整数,b是一个指针常量,表示数组第一个元素的地址.b的类型取决 ...

  3. C和指针 第六章 数组名与指针

    指针的算术运算符是指针和数组之间的一种关联,但不是唯一关联: 可以使用数组名作为指向数组第一个元素的指针,但是不可以给数组名赋新的值. //如下声明a int a[10]; //用a作为指向数组第一个 ...

  4. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  5. c++中的指针之指针在数组

    使用一维指针数组输出一维数组中的数 int array[]={1,2,3,4,5,6};        int *p; p=array;        for(int i=0;i<6;i++){ ...

  6. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  7. C/C++中数组转换成指针的情况

    数组转换成指针:在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针.比如: int ia[10]; int *p = ia; //ia转换成指向数组首元素的指针 以下情况上述转换不会发生: ...

  8. c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针

    1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] ...

  9. 指针的指针&指向指针数组的指针

    一.指针的指针    指针的指针看上去有些令人费解.它们的声明有两个星号.例如:        char ** cp;    如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...

  10. 【C语言】12-指向一维数组元素的指针

    一.用指针指向一维数组的元素 1 // 定义一个int类型的数组 2 int a[2]; 3 4 // 定义一个int类型的指针 5 int *p; 6 7 // 让指针指向数组的第0个元素 8 p ...

随机推荐

  1. CSS变形transform(2d)

    前面的话 CSS变形transform是一些效果的集合,主要是移动.旋转.缩放和倾斜这四种基本操作,还可以通过设置matrix矩阵来实现更复杂的效果.变形transform可以实现2D和3D两种效果. ...

  2. 睡前小dp-poj1276-多重背包+二进制优化

    http://poj.org/problem?id=1276 简单的多重背包,不过需要优化一下才能过.网上还有暴力的做法. 二进制优化在背包九讲里讲的比较清楚.对于多重背包的每一件物品,使用二进制的形 ...

  3. jdbc,mybatis,hibernate各自有优缺点以及区别

    JDBC: 我们平时使用jdbc进行编程,大致需要下面几个步骤: 1,使用jdbc编程需要连接数据库,注册驱动和数据库信息 2,操作Connection,打开Statement对象 3,通过State ...

  4. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)(转)

    (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.若(m+1) | n,则先手必败,否则先手必胜.显然,如果n=m+1 ...

  5. day9 字符串格式化输出 % .format()

    常用的格式化输出方式1 % 方式 print("i am %s my hobby is %s" %("yt","eat")) 打印浮点数,. ...

  6. [hgoi#2019/3/3]赛后总结

    T1--最长公共前缀(lcp) 定义两个字符串S,T 的最长公共前缀lcp(S,T)为最长的字符串R,满足R 既是S 的前缀又是T 的前缀. 给定一个字符串S,下标从1 开始,每次询问给出四个正整数a ...

  7. matplotlib fill和fill_between

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 5 * np.pi, 1000) y1 = np.sin(x ...

  8. [luogu2114][起床困难综合症]

    luogu2114 思路 因为位运算对于每一位是独立的,所以对每一位都对这n个数进行操作,然后观察最后得出的是1还是0.并且保证每一位拼起来之后要比m小. 代码 #include<cstdio& ...

  9. redis访问安全加固

    目录 redis漏洞 入侵特征 安全隐患 redis安全规范 禁止root用户启动 限制redis文件目录访问权限 开启密码认证,设置复杂密码 禁用或重命名危险命令 设置允许监听地址,不要使用0.0. ...

  10. MATLAB:图像减法运算(imsubtract函数)

    图像减法运行涉及到imsubtract函数 实现代码如下: clear all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clc close all; A=imread('ca ...