指针和字符串:求待定字符的位置

#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
启示:数组指针直接指向了数组,里面的元素为数组(或者字符)

           指针数组里面的元素值为地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值