• [C++]数组指针与指针数组


    //声明:
        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	p[i][j]:%d]	 ",array[i][j],p[i][j]);
    			printf(" [array[i][j]:%d	p[i][j]:%d]	 ",array[i][j],*(p[i]+j));//二者等效 ;注意:p[i]+j:将指向p[i][j]的地址 
    		}
    		printf("
    ");
    	}
    	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]<<' ';
        }
      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]<<' ';
        cout<<*(p[i]+1)<<' ';
      }
    }
     
    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] (先定位,再引用值
    */
  • 相关阅读:
    sql server中将一个字段根据某个字符拆分成多个字段显示
    MVC中使用Action全局过滤器出现:网页无法正常运作 将您重定向的次数过多。解决办法
    C#中将DataTable转成List
    Dictionary读取键值的快捷方法
    jquery检测浏览器类型
    ubuntu安装网易云音乐
    Ufw使用指南
    MySQL数据库基础命令
    ubuntu搭建ftp后,winSCP连接报错为“列出’/home/ftp’的目录项时出错”
    linux ftp服务器设置,只允许用户访问指定的文件夹,禁止访问其他文件夹
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/7155108.html
Copyright © 2020-2023  润新知