如何使函数,指针和字符串工作?为什么strchr()会在搜索到的角色后获取字符?

时间:2018-04-25 23:27:02

标签: c pointers puts

示例如下。根据我的理解,tp是指向字符串地址的相同指针? 我对指针和字符串感到困惑。 puts(p)会给出字符串的地址而不是字符吗?另外,我无法弄清strchr函数的工作原理。 ++ p将指向'之后的下一个字符:',它是如何工作的,它是否正确?  请帮忙!感谢。

char *t = "MEAS:VOLT:DC?";
char *p;  
p = t;     
puts( p );
while(( p = strchr( p, ':' )) != NULL )
{ puts( ++p )}}

1 个答案:

答案 0 :(得分:1)

什么是指针?指针是存储地址(存储器)的变量 地点)。这可以是另一个变量的地址

int n = 9;
int *ptr = &n; // stores the address of n

或者它可以是内存块的开始,例如动态分配 内存块:

int *fields = malloc(len * sizeof *fields);

无论指针指向哪个地址,我们都使用指针直接访问 存储在指针中的内存(我们也说指针所在的) 指向)。

什么是字符串?您必须了解的是C没有像其他类型的字符串类型 编程语言呢。在C中,字符串只是一个8位值序列 (代表字符)以'\0' - 终止字节结尾。自然 单个字符的类型是char,这就是我们使用char*char[]的原因 得到一个字符串。

当你这样做时

const char *str = "Hello";

str指向内存中的某个位置,它看起来像这样:

b = base address of the first character in the
    sequence

b     b+1   b+2   b+3   b+4   b+5
+-----+-----+-----+-----+-----+------+
| 'H' | 'e' | 'l' | 'l' | 'o' | '\0' |
+-----+-----+-----+-----+-----+------+

'H'这样的字符常量的整数值由 ASCII表。所以实际上内存看起来像这样:

b = base address of the first character in the
    sequence

b     b+1   b+2   b+3   b+4   b+5
+----+-----+-----+-----+-----+-----+
| 72 | 101 | 108 | 108 | 111 |  0  |
+----+-----+-----+-----+-----+-----+

因此str指向该位置bstr[0]是第一个字符str[1] 是第二个,等等。如你所见,要获得一个字符串,你只需要访问 序列中的第一个字符。这就是我们使用char*的原因 指向地址字符串的指针,因为我们可以访问char*指针 字符串中的第一个和后续字符。

puts(str)这样的函数执行以下操作:

  • 是当前字符'\0' - 终止字节?
    • 如果是,则退出
    • 如果不是,则打印角色并前进到下一个角色

因此puts(str)不会打印指针指向的地址,它会打印内存所在的内容 指针指向。

strchr这样的函数的工作原理如下:

  

man strchr

char *strchr(const char *s, int c);
     

<强>描述

     

strchr()函数返回指向字符串c中第一个字符s的指针。

现在您已了解字符串的内存布局,这应该很容易 了解。我们来看看这个:

const char *str = "Hello";
char *f = strchr(str, 'l');

请记住,str指向的内存布局是:

b = base address of the first character in the
    sequence

b     b+1   b+2   b+3   b+4   b+5
+-----+-----+-----+-----+-----+------+
| 'H' | 'e' | 'l' | 'l' | 'o' | '\0' |
+-----+-----+-----+-----+-----+------+
               ^
               ¦
       first occurrence
            of 'l'

所以strchr返回的是一个指向b+2(或str+2的指针,因为在 我的例子b是指针str正在存储的值。

这就是为什么你puts(str)Hello得到puts(f)以及何时llo 你得到strchr

char *strchr(const char *s, int c); { // stop when the \0-terminating byte is reached for(size_t i = 0; s[i] != '\0'; ++i) { if(s[i] == c) return &s[i]; // or return s+i; using pointer arithmetic } return NULL; // c is not found in the string } 的一个简单实现是:

while(( p = strchr( p, ':' )) != NULL )
{ 
    puts( ++p )
}

这是做什么的?

strchr

第一次NULL返回的值不是:时,它会返回 指向第一次出现冒号puts(++p)的指针。 p = p + 1; // let p point to the next next character after the colon puts(p); // prints the string 相当于

strchr

然后再次执行:,因为还有一个冒号NULL 字符串,它不会返回:,而是存储strchr的位置。该 下次循环执行时,不再有冒号和NULL 返回MEAS:VOLT:DC? // puts( p ); VOLT:DC? // 1. puts( ++p ); of the loop DC? // 2. puts( ++p ); of the loop ,从而结束循环。所以输出将是:

{{1}}