函数指针问题,求大佬指点,-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 867|回复: 11

[已解决] 函数指针问题,求大佬指点,

[复制链接]
回帖奖励 4 金币 回复本帖可获得 1 金币奖励! 每人限 1 次(中奖概率 50%)
发表于 2021-12-28 20:19 | 显示全部楼层 |阅读模式
本帖最后由 luke-xgy 于 2021-12-29 14:28 编辑

//
//两个处理"hello!World"字符串的函数 会互相影响是为啥,我把第二个改要处理的字符串改为"hello!World2" 输出结果就正确,是我的字符串声明有问题还是函数?
char *d=NULL;
void setup(){
  Serial.begin(9600);
  d="hello!World";
  upperr(d);//全部大写
  Serial.println(d); // 预期结果 全部大写

  char *f = upper1("hello!World",3);//前三位大写
  Serial.println(f); //预期结果前三位大写
}

void loop()
{  
}
//1--没有返回值的函数
void upperr(char *ptrD){
  while(*ptrD){         
    if(*ptrD<97 || *ptrD>122){
    ptrD++;
    continue;
  }
    *ptrD-=32; //取值
    ptrD++;    //指针后移一位

  }
}

char * upper1(char *ptrC,int num){ //
  char *temp=ptrC ;       //记录ptrc的首地址
  while(*ptrC){         //值为True
    num--;
    if(num<0){
      break;}
    if(*ptrC<97 || *ptrC>122){
    ptrC++;
    continue;
  }
    *ptrC-=32; //取值
     ptrC++;    //指针后移一位

  }
  return temp; // 返回指针
}


发表于 2021-12-28 20:31 | 显示全部楼层
"hello!World"是const类型的,你确定能改???
 楼主| 发表于 2021-12-28 20:35 | 显示全部楼层
XlinliY.Zhang 发表于 2021-12-28 20:31
"hello!World"是const类型的,你确定能改???

我是用指针声明的 字符串,能改的。不是const n="hello!World"
发表于 2021-12-28 20:37 | 显示全部楼层
luke-xgy 发表于 2021-12-28 20:35
我是用指针声明的 字符串,能改的。不是const n="hello!World"

问题是你D也没初始化、、、
 楼主| 发表于 2021-12-28 20:39 | 显示全部楼层
XlinliY.Zhang 发表于 2021-12-28 20:37
问题是你D也没初始化、、、

char *d=NULL; 第一行就是指针d的初始化
发表于 2021-12-28 20:42 | 显示全部楼层
luke-xgy 发表于 2021-12-28 20:39
char *d=NULL; 第一行就是指针d的初始化

先去学C吧、、、、、
 楼主| 发表于 2021-12-28 20:46 | 显示全部楼层
XlinliY.Zhang 发表于 2021-12-28 20:42
先去学C吧、、、、、

就是在学得时候遇到这种问题,我把第一函数注释掉,就第二个函数就正常了
发表于 2021-12-29 09:58 | 显示全部楼层
当然,因为你只定义了两个指针,而且是指向同一个常量字符串的。(只有一个空间)
要么就别用指针,直接定义数组。。(各自存在空间)
 楼主| 发表于 2021-12-29 11:05 | 显示全部楼层
sangshu 发表于 2021-12-29 09:58
当然,因为你只定义了两个指针,而且是指向同一个常量字符串的。(只有一个空间)
要么就别用指针,直接定 ...

谢谢大佬,我是刚写c的小白。按照你的建议先定义数组字符串再赋值给指针,果然好了。
void setup(){
  Serial.begin(9600);
  char a[] ="hello!World";
  char *d=a;
  upperr(d);//全部大写
  Serial.println(d); //预期结果 全部大写

请问大佬给指针直接赋值双引号的字符串,那这个字符串默认就是个匿名常量? 我之前理解的常量定义是 const x= "hello!World"; 是不是有什么有误区
发表于 2021-12-29 14:38 | 显示全部楼层
luke-xgy 发表于 2021-12-29 11:05
谢谢大佬,我是刚写c的小白。按照你的建议先定义数组字符串再赋值给指针,果然好了。
void setup(){
  Se ...

如果创建数组,这个字符串和你创建的数组,只是初始化关系。字符在内部只存在你管理的数组中。
而创建指针的话,只有这个指针才是你的,它指向的字符串,是常量,不是你的,不能通过指针去修改它。你只能修改你指针的指向。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 17:50 , Processed in 0.199802 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表