指针与二维数组

简介: 这是一个大一的学生问我的问题,当时竟然搞糊涂了!!! 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  

 

目录
相关文章
|
5月前
|
C语言
C语言---二维数组&&指针
C语言---二维数组&&指针
26 0
|
5天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
5天前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
4月前
指针\动态二维数组空间
指针\动态二维数组空间
26 4
|
1月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
4月前
|
C语言
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
C语言----关于二维数组传参的本质相关的知识点(数组指针、指针数组)
|
4月前
|
C语言
C语言----指针模拟二维数组
C语言----指针模拟二维数组
|
5月前
|
存储 算法 C语言
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
52 0
|
5月前
指针的基础应用(数组的颠倒和排序,二维数组的表示)
指针的基础应用(数组的颠倒和排序,二维数组的表示)
31 0