指针与二维数组

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

 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  

 

posted @ 2012-09-23 13:22  加拿大小哥哥  阅读(1522)  评论(0编辑  收藏  举报