<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