zoukankan      html  css  js  c++  java
  • 指针与二维数组

    这是一个大一的学生问我的问题,当时竟然搞糊涂了!!!

     1 #include <stdio.h>
     2 int main()
     3 { 
     4      char str[ ][10]={"China","Beijing"};
     5      char *p;
     6      p = str[0];
     7      printf("%s\n",p+10);
     8      while(1);
     9      return 0;
    10 }
    11 /*
    12 p输出china
    13 p+1输出hina
    14 …………
    15 P+4输出a;
    16 从P+5到p+9,无输出
    17 p+10输出beijing
    18 */ 
    19  
     1 //指向二维数组行的指针变量 ,使用行地址,即p+1是str[1] 
     2 #include <stdio.h>
     3 int main()
     4 { 
     5      char str[ ][10]={"China","Beijing"};
     6      char (*p)[10];//p是指针,指向含有10个char型元素的一位数组 
     7      p = str;//不是str[0] ,也不能是&str[0][0] ,可以使&str[0] 
     8      printf("%s\n",p+1);//输出beijing 
     9      while(1);
    10      return 0;
    11 }
     1 //指向二维数组的指针,使用列地址,即p+1是str[0][1] 
     2 #include <stdio.h>
     3 int main()
     4 { 
     5      char str[ ][10]={"China","Beijing"};
     6      char *p; 
     7      p = str[0];
     8      printf("%s\n",p+1);//输出hina
     9      while(1);
    10      return 0;
    11 }

    综上:str和str[0],str+1和str[0]+1的值虽然相同,但是意思却截然不同,一个是行地址,一个是列地址,也就是说相应指针执行加一操作时,1所代表的字节数是不一样的.

     1 //使用二级指针 
     2 #include<stdio.h> 
     3 #define SIZE 5
     4 int main( )
     5 { 
     6      char *pc[]={" Beijing", "Shanghai", "Tianjing", "Guangzhou", "Chongqing" };
     7      char **p;
     8      int i;
     9      for ( i=0; i<SIZE;i++)
    10      { 
    11           p = pc+i;
    12           printf ("%s\n", *p);
    13      }
    14      while(1);
    15      return 0;
    16 }

     使用上面的传参时,fun(char *str[])

    //指向字符数组的指针变量
    char str[20]={"abcdef"};//定义时初始化,否则只能用输入函数了 。可以省略20,直接str[]={"abcde"} 
    char *p;
    p = str;//&str[0]也可 
    使用for(i=0;p[0]!='\0';i++)即可遍历 
    
    //指向字符串常量的指针变量
    char *p = "abcde";//定义时初始化,只是将字符串的首地址给了p,c中没有字符串变量
    等价于
    char *p;
    p = "abcde"; 
    输出时直接printf("%s\n",p); 
    从第二位 printf("%s\n",p+1);
    

    综上:可以看出使用字符串指针比较方便,也比较安全。

     1 //指针数组
     2 #include <stdio.h>
     3 int main()
     4 {
     5      static int a[3][3]={1,2,3,4,5,6,7,8,9};
     6      int *p[3] = {a[0],a[1],a[2]};
     7      for(int i=0;i<3;i++)
     8           printf("%d ",*p[i]);//每行的第一个元素 
     9      printf("\n");
    10      while(1);
    11      return 0;
    12 }
    13  
  • 相关阅读:
    luogu1117 优秀的拆分 (后缀数组)
    hdu5238 calculator (线段树+crt)
    [模板]中国剩余定理/扩展中国剩余定理
    [模板]欧几里得算法/扩展欧几里得
    cf1088E Ehab and a component choosing problem (树形dp)
    cf1088D Ehab and another another xor problem (构造)
    cf1088C Ehab and a 2-operation task (构造)
    luogu3292 幸运数字 (点分治+线性基)
    2017-03-10<Git版本回退>
    2017-03-09<AS目录结构>
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2698876.html
Copyright © 2011-2022 走看看