指针与二维数组

简介: 这是一个大一的学生问我的问题,当时竟然搞糊涂了!!! 1 #include 2 int main() 3 { 4 char str[ ][10]={"China","Beijing"}; 5 char *p; 6 p = str[0]; ...

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

 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  

 

目录
相关文章
|
1月前
|
C语言
C语言---二维数组&&指针
C语言---二维数组&&指针
13 0
|
3月前
|
C语言 定位技术 存储
【C语言基础入门】二级指针、一维数组与指针、二维数组与指针
【C语言基础入门】二级指针、一维数组与指针、二维数组与指针
【C语言基础入门】二级指针、一维数组与指针、二维数组与指针
|
4月前
|
存储 并行计算 C++
指针详解(二级指针、指针数组和数组指针、字符指针、二维数组传参、函数指针变量)(二)
指针详解(二级指针、指针数组和数组指针、字符指针、二维数组传参、函数指针变量)(二)
|
10月前
|
C语言
C语言程序设计(王立柱)第九章答案 二维数组和指针
只有聪明人才能看见的摘要~( ̄▽ ̄~)~
54 0
|
10月前
|
C语言
深度理解C语言四——指针的进阶二(函数指针,函数指针数组,一维、二维数组传参,指针传参)
深度理解C语言四——指针的进阶二(函数指针,函数指针数组,一维、二维数组传参,指针传参)
93 0
|
11月前
指针与二维数组(笔记,一脸懵)
指针与二维数组(笔记,一脸懵)
|
12月前
|
C语言
c语言 二维数组指针
概述: 二维数组指针的定义就是把一维数组换成二维数组。二维数组的各个元素也都是地址。 步骤: int a[2][3] = { {1,2,3},{4,5,6} }; / / 定义一个二维数组 int (*p)[2][3] = &a; / / a 是整个二维数组的地址 int (*p)[2][3] 为二维数组指针类型,p ==&a 所以(*p)的用法和 a 一样,a[1][1] == ( *p)[1][1]; a[0] 和a[1] 是两个小数组的名字,所以 &a[0] , &a[1] 是一维数组类型 int (*)[3].
143 0
指针和数组试题解析(5)二维数组部分
指针和数组试题解析(5)二维数组部分
53 0
指针和数组试题解析(5)二维数组部分
|
存储 程序员 C语言
指针和二维数组|学习笔记
快速学习指针和二维数组
54 0
指针和二维数组|学习笔记