zoukankan      html  css  js  c++  java
  • C指针(3)——指向指针的指针(程序讲解)

    int **q可以分成两部分,即int* 和 (*q),后面的 “q” 中的* 表示q是一个指针变量,前面的int*表示指针变量q只能存放int*型变量的地址。int** q表示为指针变量q只能存放int*型变量的地址。

    4-1.c多维数组的定义

    #include<stdio.h>
    int main(void)
    {
      int i,j;
      int data[2][3]={{1,2,3},{4,5,6}};    //定义二维数组data,2行3列;并对其进行初始化
      printf("data[2][3]:
    ");
       for(i=0;i<2;i++)
        {
          for(j=0;j<3;j++)
             {
               printf(" %d",data[i][j]);  
             }
          printf("
    ");
         }
      return 0;
    }  

    上例子为(a)

          结果(a):

    data[2][3]:
     1 2 3
     4 5 6  

    对(a)进行修改:数组 int data[2][3];  只定义不赋值。

         结果(b):

    data[2][3]:
     -858993460 -858993460 -858993460
     -858993460 -858993460 -858993460  

    对(a)进行修改:数组 int data[2][3]={{1,2,3}};

        结果(c):

    data[2][3]:
     1 2 3
     0 0 0
    

    对(a)进行修改: printf(" %d",&data[i][j]);

           结果(d):

     data[2][3]:
     2227836 2227840 2227844
     2227848 2227852 2227856
    

     

    4-2.c指针的指针 

    #include<stdio.h>
    int main(void)
    {
      char *name[]={"Fujian","Huian"};  //定义指针数组name,并对其进行初始化
      char **p_name;                    //定义指针的指针p_name
      printf("name[0]:%p
    ",name[0]);   //输出指针数组元素name[0]的值,这里是第一个字符串的首地址
      printf("name[1]:%p
    ",name[1]);
      printf("
    ");
      p_name=&name[0];                  //把name[0]的地址赋值给p_name,即p_name指向name[0],因为name[0]的内容是地址,所以p_name是指向地址的指针变量,即指针的指针
      printf("&name[0]:%p
    ",p_name);   //输出p_name的值,即name[0]的地址
      p_name=&name[1];
      printf("&name[1]:%p
    ",p_name);
      return 0;
    }
    

      两个地址:前一个是指针变量的内容(为一个地址),即被指针变量指向的数据的地址;

             后一个是指针变量本身的地址,这个地址就是指针的指针的内容。

    结果:

    name[0]:000E5788
    name[1]:000E5780 
    
    &name[0]:002EF854
    &name[1]:002EF858
    

    4-3.c

    #include <stdio.h>
    int main(void)
    {
      char *name[ ]={"Fujian","Quanzhou"};
      char **p_name;
       int i;
      p_name=name;
      for(i=0;i<2;i++)
      {
           printf("%s",*(p_name+i));
       }
        printf("
    ");
        return 0;
    }
    

      

    补充指针,就是地址;指针变量就是存储地址的变量。

             对于多维数组int data[2][3] ; 2行3列,二维数组可以理解为一维数组的嵌套。

             可以理解为:

        • data是一个一维数组,包含  data[0],data[1]   2个元素
        • 而 data[0] 又是一个一维数组,包含  data[0][0],data[0][1],data[0][2]  3个元素
        • data是 data[0],data[1]  的数组名,所以数组名 data是data[0] 的地址
        • data[0]是数组  data[0][0],data[0][1],data[0][2] 的数组名,数组名是首元素的地址,所以data[0]是data[0][0]的地址 
        • 对于一维数组 a[ ] ,则有 a[i] 相当于 *[a+i]    
        • 对于二维数组data[ ][ ],则有data[i][j] 相当于*(data[i]+j)  或者 *data(*(data+i)+j)       
  • 相关阅读:
    .Net Core DI依赖注入:一个接口注入多个实现类(转载)
    单表千万行数据库 LIKE 搜索优化手记(链接)
    Do the JSON keys have to be surrounded by quotes?(转载)
    梳理情绪解决问题
    MYSQL主从数据库同步备份配置的方法
    VMware ESXI 6.5 安装及配置
    linux centos7 完整邮件服务器搭建及调用_2018_lcf
    利用Tampermonkey(油猴)+ IDM 实现百度云盘大文件下载(IDM安装教程)
    Java中使用feign遇到的坑
    微服务为什么要有服务发现与注册?
  • 原文地址:https://www.cnblogs.com/happying30/p/9382408.html
Copyright © 2011-2022 走看看