指针与二维数组

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

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


//使用二级指针 
#include<stdio.h> 
#define SIZE 5
int main( )

     char *pc[]={" Beijing", "Shanghai", "Tianjing", "Guangzhou", "Chongqing" };
     char **p;
     int i;
     for ( i=0; i<SIZE;i++)
     { 
          p = pc+i;
          printf ("%s\n", *p);
     }
     while(1);
     return 0;
}

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

?
1
2
3
4
5
//指向字符数组的指针变量
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  
复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值