#include<iostream>
#include<cstring>
int main()
{
cout<<"输入字符串:";
char str;
gets(str);
char *p,ch;
cout<<"输入要寻找的字符:";
getc(ch);
p=strchr(str,ch);
cout<<"这个字符在的位置为:"<<p-str<<endl;
return 0;
}
char *strchr(char *str,char ch)
{
while(*str!='\0'){
if(*str==ch) return str;
str++;
}
return NULL;
}
如果是要求所有的位置呢?
遍历整个字符串,当找到这个位置,输出。然后继续这个循环。
但是这样并没有储存起来,只是输出而已,怎么保存这些数据?
可以定义一个新数组b[n],得到位置储存在b[i],然后继续寻找,得到后储存在b[++i]中。
重要的是数组与指针的关系
-从数字一维数组与指针的关系,地址与指针的对应,各种类型是否一致
-指针的运算:p+i(i为整数)此时为地址的变换
-然后字符串与字符数组与数组指针:
1) char str[81]="abcde";
char *pstr="abcde"; //两个都是正确的。数组与数组指针有点类似
2) char str[81],*pstr;
str="abcde";
pstr="abcde"; //两个都是正确的
3) char str[81],*pstr;
cin>>str; //gets(str); //scanf("%s",str); //正确
cin>>pstr; //错误
-指针数组与数组指针
1)指针数组:用于存储指针的数组,数组元素都是指针 *a[4]
数组指针:每个元素都不是指针,但是这个指针指向数组 (*)a[4]
2)在我看来,数组指针与数组的区别就是:
数组指针多了这一行:
int *p=str;
这个时候,数组指针不像数组还要定义指针,并让指针指向这个数组。而是直接就指向这个数组了,可以直接访问(*p可以直接用了)
3)指针数组有什么用呢?
#include <stdio.h>
main()
{
static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定义二维数组m并初始化*/
int (*p)[4];//数组指针 p是指针,指向一维数组,每个一维数组有4个int元素
int i,j;
int *q[3];//指针数组 q是数组,数组元素是指针,3个int指针
p=m; //p是指针,可以直接指向二维数组
printf("--数组指针输出元素--/n");
for(i=0;i<3;i++)/*输出二维数组中各个元素的数值*/
{
for(j=0;j<4;j++)
{
printf("%3d ",*(*(p+i)+j));
}
printf("/n");
}
printf("/n");
for(i=0;i<3;i++,p++)//p可看成是行指针
{
printf("%3d ",**p);//每一行的第一个元素
printf("%3d ",*(*p+1));//每一行的第二个元素
printf("%3d ",*(*p+2));//每一行的第三个元素
printf("%3d ",*(*p+3));//每一行的第四个元素
printf("/n");
}
printf("/n");
printf("--指针数组输出元素--/n");
for(i=0;i<3;i++)
q[i]=m[i];//q是数组,元素q[i]是指针
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%3d ",q[i][j]);//q[i][j]可换成*(q[i]+j)
}
printf("/n");
}
printf("/n");
q[0]=m[0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%3d ",*(q[0]+j+4*i));
}
printf("/n");
}
printf("/n");
}
这个代码转载自kaiming2008
启示:数组指针直接指向了数组,里面的元素为数组(或者字符)
指针数组里面的元素值为地址