//声明:
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. html5應用緩存

    HTML5使用了應用緩存,就是web應用緩存,使得在離線狀態下可以訪問web'應用. 應用緩存的優點: 離線訪問-可以在無網的狀態下訪問應用 速度-有緩存的應用加載更快 瀏覽器負載-瀏覽器只從服務器加 ...

  2. mysql 创建表指定 字符类型与存储引擎

    DROP TABLE IF EXISTS apilog; /*==============================================================*/ /* T ...

  3. BZOJ4836 二元运算(分治FFT)

    设A(n)为a中n的个数,B(n)为b中n的个数.如果只考虑加法显然是一个卷积,减法翻转一下也显然是一个卷积. 问题在于两者都有.容易想到分开处理.那么可以考虑分治.即对于值域区间[l,r],分别计算 ...

  4. Spring事务说明与自实现

    要使用Springboot的事务其实非常简单,在启动类上添加@EnableTransactionManagement,在Service的类或者方法上使用@Transactional就可以了. 事务本身 ...

  5. Java NIO -- 管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接. Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 举个例子: package com.soyo ...

  6. java 反射 子类泛型的class

    很早之前写过利用泛型和反射机制抽象DAO ,对其中获取子类泛型的class一直不是很理解.关键的地方是HibernateBaseDao的构造方法中的 Type genType = getClass() ...

  7. Raspbian首次安装后无法使用SSH链接

    使用Putty连接树莓派,出现Network Error:Connection Refused 新版的Raspbian系统默认禁用了SSH. 解决方法:在/boot分区创建名为"ssh&qu ...

  8. win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 < 0

    昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出: Call OleLoadPicture Fail - loadPictureFromMW 奇 ...

  9. property(四十)

    一个静态属性property本质就是实现了get,set,delete三种方法 用法: class Foo: @property def AAA(self): print('get的时候运行我啊') ...

  10. table默认的box-sizing在不同浏览器不同

    转载自:https://blog.csdn.net/csm0912/article/details/88290672