C 为什么我在某些地方使用*而在某些地方没有使用

C 为什么我在某些地方使用*而在某些地方没有使用,c,string,pointers,C,String,Pointers,所以我无法理解C中的指针代码。基本上它从字符串中删除数字。我很困惑为什么有些地方使用*src,有些地方不使用。另外,请解释一下这段代码是如何工作的 char* RemoveDigits(char* input) { char* dest = input; char* src = input; while(*src) { if (isdigit(*src)) { src++; continue; } //here we are

所以我无法理解C中的指针代码。基本上它从字符串中删除数字。我很困惑为什么有些地方使用*src,有些地方不使用。另外,请解释一下这段代码是如何工作的

char* RemoveDigits(char* input)
{
    char* dest = input;
    char* src = input;

    while(*src)
    {
        if (isdigit(*src)) 


       { src++; continue; } //here we are using src and not *src.
        *dest++ = *src++;
    }
    *dest = '\0';
    return input;
}
  • src
    指针用于推进输入以查找非数字
  • dst
    指针用于在将非数字复制到输入后推进输入
  • 由于结果字符串等于或小于原始字符串,因此在末尾添加了空终止符
    '\0'
  • 输入
    指针是完整的,包含字符串的开头,这是您需要的,也是返回的
下面是演练:()-src指针,[]-dst指针:

{[(1)], 2, 'a', 'b', '\0'}
dst == input, src == input

{[1], (2), 'a', 'b', '\0'}
dst == input, src == input + 1

{[1], 2, ('a'), 'b', '\0'}
dst == input, src == input + 2
*dst = *src // copy because *src is not a digit

{'a', [2], 'a', ('b'), '\0'}
dst == input + 1, src == input + 3
*dst = *src // copy because *src is not a digit

{'a', 'b', ['a'], 'b', ('\0')}
dst == input + 2, src == input + 4
*src == false // no more copying, loop ends
dst* = '\0'; // terninating null added

{'a', 'b', ['\0'], 'b', ('\0')}
  ^ - input pointer

C中的指针是用星号声明的。指针是一种基本数据类型,它保存指向变量的指针对象(或地址)。为了访问指针指向的数据,我们再次使用星号取消引用指针

指针可以指向
char
数组(字符串)的第一个字符(保存地址),这是代码段中的大小写。

src++
此特定指令使指针指向数组中的下一个字符。


*src
此指令指示指针访问它指向的字符。

简短回答:

char* RemoveDigits(char* input) {
   char* dest = input;
   char* src = input;
   while(*src) { 
      if (isdigit(*src)) { 
         src++; continue; 
      } //here we are using src and not *src.
      *dest++ = *src++;
   }
   *dest = '\0'; return input;
}
去研究一下指针,它真的很重要,而且很难用几行答案来解释。一旦你这么做了,就去做详细的回答

长答案:

char* RemoveDigits(char* input) {
   char* dest = input;
   char* src = input;
   while(*src) { 
      if (isdigit(*src)) { 
         src++; continue; 
      } //here we are using src and not *src.
      *dest++ = *src++;
   }
   *dest = '\0'; return input;
}
要理解这段代码,您需要了解字符数组在C中的工作方式。 如果您声明“char[5]example=“test”变量“example”将是指向数组第一个字符的指针,这意味着它将包含存储“t”字符的内存地址

如果你输入“*example”,你基本上是说“给我存储在变量“example”中指定的内存地址的值”,这实际上意味着“给我第一个字母”,事实上,如果你输入printf(“%c”,example),它将显示“T”

一旦您理解了这一点,就很容易猜到,通过说“example++”,您将从“T”的地址更改为内存“E”中的下一个值,依此类推

现在让我们转到另一点,while是如何工作的? 一旦您了解了如何在C中管理字符数组,就很容易理解这一点。每个存储的字符数组都始终带有“\0”字符。如果放入while语句中,每个字符都将被视为“true”,但“/0”将被视为“false”。通过检查存储在src中的值并在你是说“检查所有角色直到结束”

最后一件事:如果当前字符“*src”是一个数字字符,只需传递到下一个字符并重新启动,而不执行下面的代码,否则如果它是一个相关字符,则将其写入目标数组“*dest=*src”,然后递增“dest++”和“src++”,为下一个字符准备空间


我第一次知道这有点复杂,如果你需要更多帮助,请发表评论。无论如何,在互联网上有很多很好的教程。

while(*src)给出了什么以及为什么我必须结束*dest=\0”。请解释这段代码是如何工作的。“这不是一个问题。在我看来,在没有基础知识的情况下,通过挑选代码位来学习C语言是无效的,甚至可能是有害的。我建议看一看:-)指针只是一个变量,它将其他对象的地址作为它的值。换句话说,指针指向可以找到其他内容的地址。例如,
inta=5
将立即值
5
存储为其值
int*b
创建指向
int
b=&a
存储
a
的地址(其中当前存储的是
5
)作为其值。如果需要存储在地址
b
指向的值,可以使用一元
'*'
运算符取消引用
b
,例如
int c=*b将初始化
c=5
)。